我正在使用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。
我很感激任何人都可以提供帮助。
答案 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)