Tag: cmake

CMake条件预处理器定义代码

我正在将一个makefile项目迁移到CMake。 第一次编写makefile的人已经完成了一个用于在include文件中写入某些值的模块。 有一个主config.h文件,其中包含config_in.h。 config.h文件包含以下内容: #ifndef USE_FEATURE_A #define USE_FEATURE_A 0 #endif #ifndef USE_FEATURE_B #define USE_FEATURE_B 0 #endif 在makefile中有一个假目标,如with_feature_a ,它在config_in.h中写入 #define USE_FEATURE_A 1 通过这种方式,有人可以打字 make with_feature_a make 获得正确的构建。 我想使用这个代码库但使用CMake来复制这样的东西。 我在网上尝试了几种方法,但我没有让它发挥作用。 set_target_properties(with_feature_a PROPERTIES COMPILE_DEFINITIONS “WITH_FEATURE_A=1” ) 这不起作用,因为如果我跑 make with_feature_a 我没有在预处理器命令行中看到with_feature_a 。 我做的第二次尝试是直接用内容集写一个文件到我想要的东西,但我不明白如何将file()命令连接到我的目标。 我把它放在我的CMakeLists.txt中 file(WRITE local/config_in.h “#define WITH_FEATURE_A 1” ) 但这并不是每次都执行,我不知道如何将其设置为单个目标。 任何帮助表示赞赏。 感谢您阅读所有这些内容。 对不起长话:) UPDATE 这里提供的解决方案是解决问题之路上的一大亮点。 问题是不允许递归定义。 我举了一个例子: 在CMakeLists.txt我放置: […]

将旧的makefile转换为CMake

我正在尝试将旧的makefile代码转换为CMake。 你能帮助我吗? 这是我目前陷入困境的部分。 我不知道如何将这些参数传递给编译器。 COMPILE_FLAGS = -c -m32 -O3 -fPIC -w -DSOMETHING -Wall -I src/sdk/core ifdef STATIC OUTFILE = “bin/test_static.so” COMPILE_FLAGS_2 = ./lib/ABC.a else OUTFILE = “bin/test.so” COMPILE_FLAGS_2 = -L/usr/lib/mysql -lABC endif all: g++ $(COMPILE_FLAGS) src/sdk/*.cpp g++ $(COMPILE_FLAGS) src/*.cpp g++ -fshort-wchar -shared -o $(OUTFILE) *.o $(COMPILE_FLAGS_2) rm -f *.o 谢谢!

如何使用CMAKE从命令行在Windows上构建x86和/或x64?

使用Visual Studio让cmake在Windows上构建x86的一种方法是这样的: 启动x86的Visual Studio命令提示符 运行cmake: cmake -G “NMake Makefiles” \path_to_source\ NMAKE 使用Visual Studio让cmake在Windows上构建x64的一种方法是这样的: 启动x64的Visual Studio命令提示符 运行cmake: cmake -G “NMake Makefiles” \path_to_source\ NMAKE 使用Cmake,我如何编译其中一个或两个架构? (就像Visual Studio在IDE中的表现一样)

在制作ESP8266项目时获取C函数的未定义引用

我按照本教程将一个Kaa应用程序安装到ESP8266中,经过一些修改后它可以工作: https ://kaaproject.github.io/kaa/docs/v0.10.0/Programming-guide/Using-Kaa-endpoint-SDKs / C / SDK-ESP8266 / 我必须做的一个修改是在eagle.app.v6.ld中移动一行代码,因为字节溢出(箭头指向要改变我做的): … .irom0.text : ALIGN(4) { _irom0_text_start = ABSOLUTE(.); *(.literal.* .text.*) –> moved from “.text : ALIGN(4){…}” … } … 在我这样做后,我仍然有一些字节溢出,所以我修改了文档中的原始cmake命令,以禁用占用空间的cmake扩展: cmake \ -DCMAKE_TOOLCHAIN_FILE=../kaa/toolchains/esp8266.cmake \ -DKAA_PLATFORM=esp8266 \ -DCMAKE_BUILD_TYPE=MinSizeRel \ -DWITH_EXTENSION_CONFIGURATION=OFF \ -DWITH_EXTENSION_EVENT=OFF \ -DWITH_EXTENSION_LOGGING=OFF \ -DWITH_EXTENSION_NOTIFICATION=OFF \ -DWITH_EXTENSION_USER=OFF \ -DWITH_ENCRYPTION=OFF \ -DKAA_MAX_LOG_LEVEL=3 .. 最后,当我运行make命令时。 有效。 然后我创建并将二进制文件闪存到我的ESP中。 然后我重置我的ESP,GPIO0为高(所以它可以从闪存启动),ESP发送“Hello,Kaa!” […]

意外的未定义引用

我得到一个未定义的引用错误,不知道原因。 所以我有两个文件构成一个静态的lib:keyboard_input.c,keyboard_input.h 这是.h文件的内容: #ifndef __MOD_KBINPUT__ #define __MOD_KBINPUT__ int kbInit(); int kbWait(); int kbTest(); #endif 并且CMakeLists.txt文件如下所示: FILE( GLOB_RECURSE sources *.c ) INCLUDE_DIRECTORIES(“${PROJECT_SOURCE_DIR}/include/utils/kbreader”) ADD_LIBRARY(keyboardReader ${sources}) 编译此lib会发出一些警告: src/utils/kbreader/keyboard_input.c: In function ‘kbInit’: src/utils/kbreader/keyboard_input.c:13:14: warning: assignment from incompatible pointer type [enabled by default] src/utils/kbreader/keyboard_input.c: In function ‘kbWait’: src/utils/kbreader/keyboard_input.c:21:55: warning: passing argument 4 of ‘fread’ from incompatible pointer type [enabled by […]

dyld:惰性符号绑定失败:找不到符号 – nm报告找到符号

这里有一个相当抽象的问题,因为我不知道从哪里开始自己的调查。 我有一个用CMake构造的C包,它生成librpdb.so; 我为同一个库设置了一个Ruby Gem,它生成了rpdb.bundle。 在Ruby中使用时,我得到了这个: dyld: lazy symbol binding failed: Symbol not found: _RPDB_RuntimeStorageController_sharedInstance Referenced from: /usr/local/lib/ruby/gems/1.9.1/gems/rpdb-0.1.0/lib/rpdb/rpdb.bundle Expected in: flat namespace 当我查看图书馆时,nm会报告: 000000000000ea40 T _RPDB_RuntimeStorageController_sharedInstance 因此看起来符号确实在库中。 那么,为什么绑定会失败呢?

使用ffmpeg安装Open-CV时出错

我正在尝试在Ubuntu 11.04上安装Open-CV库。 我按照InstallationGuide中的所有说明进行操作。 但是在成功安装后我意识到我没有FFMPEG支持,因为在我的配置文件中禁用了FFMPEG : Video I/O: — DC1394 1.x: NO — DC1394 2.x: YES — FFMPEG: NO — codec: YES — format: YES — util: YES — swscale: NO — gentoo-style: YES — GStreamer: YES — UniCap: NO — PvAPI: NO — V4L/V4L2: Using libv4l — Xine: NO 所以我尝试在安装FFMEPG之后重建所有内容,如此处所述 。 使用该指令配置安装后 cmake -D CMAKE_BUILD_TYPE=RELEASE […]

如何在构建过程之后在cmake中编译其他源文件

我在cmake for windows中有一个项目,其中包含一个名为database.proc的Pro * C源文件,我的目标是从.proc文件生成一个C源文件,并将其添加到要与其他源文件链接的项目中,我试图添加一个自定义命令来实现这一点,但没有成功 add_custom_command(TARGET myproj OUTPUT PRE_LINK COMMAND ${PROC} iname=${PROJECT_SOURCE_DIR}/connection.proc SQLCHECK=SYNTAX MODE=ANSI IRECLEN=255 ORECLEN=255 ONAME=${PROJECT_SOURCE_DIR}/connection.c COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} ${PROJECT_SOURCE_DIR}/connection.c ) 有办法做到这一点吗?

如何在CMake中检查头文件和库函数,就像在Autotools中一样?

我目前正在将一个小型C项目从autotools转换为CMake 。 在旧的configure.in我使用以下行检查每个头和库函数是否存在: # Checks for header files AC_HEADER_STDC AC_CHECK_HEADERS([stdlib.h time.h math.h sys/stat.h errno.h unistd.h fcntl.h signal.h]) # Checks for library functions AC_FUNC_FORK AC_CHECK_FUNCS([time localtime mktime gmtime exit fork chdir atol signal]) AC_FUNC_STRFTIME 这就是许多autotools项目做AFAIK的事情。 尽管编译器已经检查了必要的头文件并且链接器检查了库函数,但我的代码仍然需要在配置阶段完成这些检查,以正确设置#ifdef HAVE_FOOBAR等的编译标志。 在这种情况下,使用CMake检查标头/function的最佳做法是什么?

设置CMAKE_PREFIX_PATH不能使用Android工具链

我正在使用Android CMake工具链将CMake C和C ++游戏移植到Android。 项目的库依赖项存储在PROJECTDIR/android_dependencies ,我已将以下代码添加到CMake文件中以使用它们(我检查了目录和文件是否存在)。 set(CMAKE_PREFIX_PATH “${PROJECT_SOURCE_DIR}/android_dependencies/${ANDROID_ABI}”) 但我的项目仍然说它无法找到像OpenAL这样的依赖项(所有的库都被复制了)。 如果我将库复制到$NDK/platforms/android-9/usr/lib并将文件包含到$NDK/platforms/android-9/usr/include ,项目将正确编译。 我能做错什么? 我正在使用64位的Ubuntu 16.04