【发布时间】:2017-07-06 11:39:09
【问题描述】:
我目前正在习惯 cmake,我正在尝试编译一个带有 .so 库链接的小项目。
我的项目如下。
/
CMakeLists.txt
inc/
Als.h
src/
main.c
CMakeLists.txt
lib/
libals.so
build/
我正在从构建目录编译:
$ cmake ..
-- DIR:
-- Configuring done
-- Generating done
-- Build files have been written to: /home/julien/tmp/cmakeTest/build
然后:
$ make
Linking C executable cmakeTest
/usr/bin/ld: ne peut trouver -lals
collect2: error: ld returned 1 exit status
src/CMakeFiles/cmakeTest.dir/build.make:85: recipe for target 'src/cmakeTest' failed
make[2]: *** [src/cmakeTest] Error 1
CMakeFiles/Makefile2:75: recipe for target 'src/CMakeFiles/cmakeTest.dir/all' failed
make[1]: *** [src/CMakeFiles/cmakeTest.dir/all] Error 2
Makefile:76: recipe for target 'all' failed
make: *** [all] Error 2
链接器似乎无法找到 libals.so 文件。
这里是文件/CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
PROJECT(cmaketest)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")
INCLUDE_DIRECTORIES(
inc
)
ADD_SUBDIRECTORY(src)
get_directory_property(OUT_VAR LINK_DIRECTORIES)
message(STATUS "DIR: ${OUT_VAR}")
这里是文件/src/CMakeLists.txt:
PROJECT(cmakeTest)
FILE(
GLOB
${PROJECT_NAME}_Sources
*.c
)
INCLUDE_DIRECTORIES(
inc
inc
)
ADD_EXECUTABLE(
${PROJECT_NAME}
${${PROJECT_NAME}_Sources}
)
LINK_DIRECTORIES(
/home/julien/tmp/cmakeTest/lib/
)
TARGET_LINK_LIBRARIES(
${PROJECT_NAME}
als
pthread
)
也许我错过了什么,但如果我将 /src/CMakeLists.txt 更改为:
PROJECT(cmakeTest)
FILE(
GLOB
${PROJECT_NAME}_Sources
*.c
)
INCLUDE_DIRECTORIES(
inc
inc
)
ADD_EXECUTABLE(
${PROJECT_NAME}
${${PROJECT_NAME}_Sources}
)
TARGET_LINK_LIBRARIES(
${PROJECT_NAME}
/home/julien/tmp/cmakeTest/lib/libals.so
pthread
)
编译没问题。有人知道为什么链接器无法找到 libals.so 当我给他一个好的目录路径来查看吗?
LINK_DIRECTORIES 函数似乎不起作用。
【问题讨论】:
-
"编译没问题" - 所以不要添加C和"编译"标签。
-
我的建议是你 add the library as an imported target,设置它的位置属性 (see example here) 并简单地将其用作普通库(就像你在项目中使用
pthread库一样)。实际上,它与您的工作CMakeLists.txtIMO 并没有什么不同,它更像是“cmake-ish”。 -
另外,您可能应该运行
make和VERBOSE=1以查看cmake生成的用于构建目标的命令。然后你可以看到它传递给链接器的标志和选项。
标签: cmake shared-libraries dynamic-linking