2

我有两个使用 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 列表中的每个路径,CMake 将在 FIND_PATH() 被调用时检查“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.co -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。

4

1 回答 1

4

您应该指示 CMake 在编译库时添加 -I 标志:

find_path(SANDGROUSE_INCLUDE_DIR sandgrouse/server.h)
include_directories(${SANDGROUSE_INCLUDE_DIR}

add_library()在调用之前放置这些行。

于 2013-03-09T09:35:51.573 回答