如何使用CMake为导入的共享库指定包含目录?

时间:2017-09-22 09:09:27

标签: cmake

我正在使用cmake版本3.9.1。

我的源代码树中有第三方共享库和头文件。我正在尝试将其添加为链接目标。

我能找到的所有文档都说这应该有效:

test.cpp

#include "ftd2xx.h"

int main(int argc, char **argv)
{
    FT_HANDLE handle;
    FT_STATUS status = FT_Open(1, &handle);

    return 0;
}

CMakeLists.txt

cmake_minimum_required (VERSION 3.6)
project(test_proj CXX)
add_subdirectory(ftdi)
add_executable(mytest test.cpp)
target_link_libraries(mytest ftd2xx)

ftdi/CMakeLists.txt

add_library(ftd2xx SHARED IMPORTED)
set_target_properties(ftd2xx PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})
set_target_properties(ftd2xx PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR})

然而,编译test.cpp(包括“ftd2xx.h”)会抱怨它无法找到头文件,并且生成的makefile中缺少相关的-I<path>条目。

如果我将库指定为INTERFACE而不是SHARED IMPORTED,则会正确找到头文件,但是在设置IMPORTED_LOCATION属性时会使用CMake barfs。

如果我将库指定为INTERFACE而不是SHARED IMPORTED,然后使用target_link_libraries直接指向库文件,而不是适用于Windows,而不适用于Linux。

我很感激任何人都可以提供帮助。

1 个答案:

答案 0 :(得分:3)

CMake文档确实回答了这个问题,但是如此简洁,并且在更大段落的中间,很容易错过:

The target name has scope in the directory in which it is created and below, but the GLOBAL option extends visibility.

我在更高级别的目录中使用目标名称,因此我需要将库声明为SHARED IMPORTED GLOBAL而不仅仅是SHARED IMPORTED

最终代码是:

add_library(ftd2xx SHARED IMPORTED GLOBAL)
set_target_properties(ftd2xx PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})

然后是Windows:

    set_target_properties(ftd2xx PROPERTIES IMPORTED_IMPLIB ${CMAKE_CURRENT_SOURCE_DIR}/win32/ftd2xx.lib)
    set_target_properties(ftd2xx PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/win32/ftd2xx.dll)

对于Linux:

    set_target_properties(ftd2xx PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/i386/libftd2xx.so)
相关问题