我有一个带有Makefile的小项目,我正在尝试转换为CMake,主要是为了获得CMake的经验。出于此示例的目的,项目包含一个源文件(C ++,虽然我认为该语言不是特别相关)和一个我从其他地方复制过的静态库文件。为了论证,假设库的源代码不可用;我只有.a文件和相应的标题。
我手工制作的Makefile包含以下构建规则:
main: main.o libbingitup.a
g++ -o main main.o libbingitup.a
工作正常。我如何告诉CMake重现这个?当然,这不是字面上的精确makefile,而是包含等效链接命令的东西。我尝试过明显但天真的方式,比如
add_executable(main main.cpp libbingitup.a)
或
add_executable(main main.cpp)
target_link_libraries(main libbingitup.a)
以及link_directories(.)
或add_library(bingitup STATIC IMPORTED)
等各种内容,但到目前为止没有任何内容可以导致成功的链接。我该怎么办?
版本细节:使用GCC 4.6.3在Linux(Kubuntu 12.04)上使用CMake 2.8.7
答案 0 :(得分:88)
CMake赞成将完整路径传递给链接库,因此假设libbingitup.a在${CMAKE_SOURCE_DIR}
中,则执行以下操作应该会成功:
add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)
答案 1 :(得分:15)
我觉得这很有帮助......
http://www.cmake.org/pipermail/cmake/2011-June/045222.html
从他们的例子:
ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C)
答案 2 :(得分:15)
如果您不想包含完整路径,可以执行
add_executable(main main.cpp)
target_link_libraries(main bingitup)
bingitup
与您在CMake项目中创建静态库时提供目标的名称相同:
add_library(bingitup STATIC bingitup.cpp)
CMake会自动将lib
和.a
添加到Linux的前端,.lib
最后添加到Windows上。
如果库是外部的,您可能希望使用
添加库的路径link_directories(/path/to/libraries/)
答案 3 :(得分:-1)
我想添加到其他评论中,项目名称是第一个参数。我有一个叫cmakecompile的项目,我想在里面添加libusb,代码如下,
add_executable(cmakecompile main.c)
target_link_libraries(cmakecompile "D:/msys2/mingw64/lib/libusb-1.0.a")
该项目只有一个 main.c 文件,target_link_libraries 中的第一个参数是项目名称,第二个参数是库的路径。
注意可能有帮助:由于我在 windows 下编译,我必须安装 msys2,因为您拥有的库必须使用相同的编译器编译。例如,如果您获得 libusb 并尝试在 qt-creator 项目中使用它,它将不起作用并且您可能会获得未引用的函数,因此我必须安装 msys2 并从 msys2 内部安装 libusb,安装 make 并创建一个 QT Cmake 项目并使用 msys2 make 从 Qt creator 编译。
完整的 cmakelists.txt 如下
cmake_minimum_required(VERSION 3.5)
project(cmakecompile LANGUAGES C)
add_executable(cmakecompile main.c)
target_link_libraries(cmakecompile "D:/msys2/mingw64/lib/libusb-1.0.a")