我有两个使用CMake的项目。
第一个是共享库。它编译和安装很好。目前,仍然需要构建它的“调试”版本。所以目前它安装在~/localdebug
下。该文件夹看起来像是带有'include'和'lib'目录的文件系统的根目录。与'/ usr / local'相同的概念。
第二个是程序。它需要在~/localdebug
中编译和链接我的库。它的CMakeLists.txt
文件如下所示:
cmake_minimum_required(VERSION 2.6)
set(CMAKE_C_FLAGS "-std=gnu99")
#add_definitions(-pg)
find_library(SANDGROUSE_LIB NAMES sandgrouse)
add_library(http_parser http_parser.c)
add_executable(rsva11001adapter main.c rsva11001.c)
target_link_libraries(rsva11001adapter http_parser ${SANDGROUSE_LIB})
我运行以下命令来设置make文件:
cmake --debug-output -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH="/home/ericu/localdebug" ..
基于CMake wiki,设置DCMAKE_PREFIX_PATH
完全符合我的要求。
CMAKE_PREFIX_PATH
(自CMake 2.6.0开始)使用FIND_PACKAGE(),FIND_PATH(),FIND_PROGRAM()或FIND_LIBRARY()命令搜索包含文件,二进制文件或库时使用。对于CMAKE_PREFIX_PATH列表中的每个路径,当调用FIND_PATH()时,CMake将检查“PATH / include”和“PATH”,调用FIND_PROGRAM()时将检查“PATH / bin”和“PATH”,以及“PATH / lib”和调用FIND_LIBRARY()时的“PATH”。有关更多详细信息,请参阅FIND_PACKAGE(),FIND_LIBRARY(),FIND_PATH()和FIND_PROGRAM()的文档。
然而,当我做'make VERBOSE = 1'时,这就是我得到的:
cd / home / ericu / rsva11001adapter / build / src&& / usr / bin / gcc -std = gnu99 -g -o CMakeFiles / rsva11001adapter.dir / main.c.o -c /home/ericu/rsva11001adapter/src/main.c
/home/ericu/rsva11001adapter/src/main.c:19:31:致命错误:sandgrouse / server.h:没有这样的文件或目录
编译终止。
所以,CMake似乎没有找到CMAKE_PREFIX_PATH
中的内容。显然,它不会将-I
变量添加到编译器调用中。
对CMakeCache.txt的检查使得它看起来好像不知道变量是什么:
// No help, variable specified on the command line.
CMAKE_PREFIX_PATH:UNINITIALIZED=/home/ericu/localdebug
我一直在研究这个问题超过一个小时。如果使用非标准库很困难,我几乎要放弃使用CMake。
答案 0 :(得分:4)
您应该指示CMake在编译库时添加-I标志:
find_path(SANDGROUSE_INCLUDE_DIR sandgrouse/server.h)
include_directories(${SANDGROUSE_INCLUDE_DIR}
将这些行放在add_library()
调用之前。