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

问题描述 投票:1回答:1

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

cmake dynamic-linking include-path
1个回答
4
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.