针对非标准位置的库编译CMake项目

时间:2013-03-09 03:15:39

标签: cmake dynamic-linking include-path

我有两个使用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。

1 个答案:

答案 0 :(得分:4)

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

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

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