- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我将开始声明我在 Cmake 问题上几乎完全是哑巴。
我有以下用于 Kdevelop 4.1 项目的 CMakeLists.txt
:
project(uart)
find_package(KDE4 REQUIRED)
include (KDE4Defaults)
include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevce )
add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(icons)
link_directories(/usr/lib)
find_library(SERIALDEVICE_LIB qserialdeviced)
add_executable(uart ${uart_SRCS})
target_link_libraries(uart ${SERIALDEVICE_LIB})
当我尝试构建我的项目时,我看到:
uart/build> make -j2
-- Found Qt-Version 4.6.3 (using /usr/bin/qmake-qt4)
-- Found X11: /usr/lib64/libX11.so
-- Found KDE 4.5 include dir: /usr/include/kde4
-- Found KDE 4.5 library dir: /usr/lib64/kde4/devel
-- Found the KDE4 kconfig_compiler4 preprocessor: /usr/bin/kconfig_compiler4
-- Found automoc4: /usr/bin/automoc4
CMake Error at CMakeLists.txt:16 (add_executable):
add_executable called with incorrect number of arguments
CMake Error: Attempt to add link library "/usr/lib/libqserialdeviced.so" to target "uart" which is not built by this project.
-- Configuring incomplete, errors occurred!
make: *** [cmake_check_build_system] Error 1
*** Failed ***
我读到的所有内容都说 add_executable
和 target_link_libraries
应该看起来像我文件的最后两行:
add_executable(uart ${uart_SRCS})
target_link_libraries(uart ${SERIALDEVICE_LIB})
如果我更改这两行 CMakeLists.txt
将其保留为:
project(uart)
find_package(KDE4 REQUIRED)
include (KDE4Defaults)
include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevce )
add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(icons)
link_directories(/usr/lib)
find_library(SERIALDEVICE_LIB qserialdeviced)
target_link_libraries(${SERIALDEVICE_LIB})
我明白了:
uart/build> make -j2
-- Found Qt-Version 4.6.3 (using /usr/bin/qmake-qt4)
-- Found X11: /usr/lib64/libX11.so
-- Found KDE 4.5 include dir: /usr/include/kde4
-- Found KDE 4.5 library dir: /usr/lib64/kde4/devel
-- Found the KDE4 kconfig_compiler4 preprocessor: /usr/bin/kconfig_compiler4
-- Found automoc4: /usr/bin/automoc4
-- Configuring done
-- Generating done
-- Build files have been written to: uart/build
[ 11%] Built target doc-handbook
[ 11%] Built target uart_automoc
Linking CXX executable uart
CMakeFiles/uart.dir/uart.o: In function `uart::setupSerial()':
uart/src/uart.cpp:126: undefined reference to `AbstractSerial::AbstractSerial(QObject*)'
CMakeFiles/uart.dir/uart.o: In function `uart::setupEnumerator()':
uart/src/uart.cpp:108: undefined reference to `SerialDeviceEnumerator::SerialDeviceEnumerator(QObject*)'
CMakeFiles/uart.dir/uart.o: In function `uart::setupSerial()':
uart_/uart/src/uart.cpp:136: undefined reference to `AbstractSerial::enableEmitStatus(bool)'
CMakeFiles/uart.dir/uart.o: In function `uart::setupEnumerator()':
uart_/uart/src/uart.cpp:112: undefined reference to `SerialDeviceEnumerator::setEnabled(bool)'
collect2: ld returned 1 exit status
make[2]: *** [src/uart] Error 1
make[1]: *** [src/CMakeFiles/uart.dir/all] Error 2
make: *** [all] Error 2
*** Failed ***
这清楚地表明 target_link_libraries
没有链接我的 qserialdeviced
。
qserialdeviced
位于 /usr/lib/libqserialdeviced.so.1.0.0
,正确模拟链接到 /usr/lib/libqserialdeviced.so
如果我手动将它添加到 Makefile 中,很容易找到。
我显然试过了:
target_link_libraries(-lqserialdeviced)
没有变化。
我也试过了:
if ("${SERIALDEVICE_LIB}" STREQUAL "SERIALDEVICE_LIB-NOTFOUND")
message(FATAL_ERROR "'qserialdeviced' wasn't found!")
else()
message("'qserialdeviced' found: " ${SERIALDEVICE_LIB})
endif ()
但是这个测试成功了。图书馆找到了:
'qserialdeviced' found: /usr/lib/libqserialdeviced.so
谁能帮我理解这里发生了什么?
我正在使用 Linux Fedora 13、cmake 版本 2.8.0、gcc (GCC) 4.4.5 20101112 (Red Hat 4.4.5-2) 和 kdevelop-4.1.0-1.fc13.x86_64。
谢谢我提前。
编辑:
按照@DatChu 的建议,我将 CMakeLists.txt
拆分到我的子目录中,现在一切对我来说都有意义。
谢谢大家!
最佳答案
对于原始的 CMakeLists.txt 文件,问题不在于 target_link_libraries 而在于 add_executable
add_executable(uart ${uart_SRCS})
你在哪里设置你的 uart_SRCS 变量?你有吗
set(uart_SRCS src/blahblah.cpp src/somethingblahblah.cpp)
我认为您可能误解了 add_subdirectory 的作用。它不会在里面添加源文件。它告诉 CMake 进入该文件夹并寻找另一个 CMakeLists.txt。当您的项目文件夹中有子项目时,通常会使用它。
如果你有很多源文件不想手动设置,你也可以这样做
file(GLOB uart_SRCS src/*.cpp src/*.c)
缺点是您需要手动重新运行 CMake 才能检测到新文件。请参阅 Jack 关于为什么这可能不是您想要使用的评论。
您的 CMakeLists.txt 很可能是
project(uart)
find_package(Qt4 REQUIRED)
include (${QT_USE_FILE})
find_package(KDE4 REQUIRED)
include (KDE4Defaults)
include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevice )
link_directories(/usr/lib)
file(GLOB uart_SRCS src/*.cpp src/*.h)
file(GLOB uart_HDRS include/*.h include/QSerialDevice/*.h)
find_library(SERIALDEVICE_LIB qserialdeviced)
add_executable(uart ${uart_SRCS} ${uart_HDRS})
target_link_libraries(uart ${SERIALDEVICE_LIB} ${QT_LIBRARIES})
关于c++ - Cmake target_link_libraries 没有链接我的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5395578/
我正在尝试链接我的 CMakeLists.txt 中的 Curl 库,我知道我应该要求包添加可执行文件并链接库,但我不知道如何调用变量名称以及我应该在哪里查看对于他们,你知道我应该去哪里找吗?有没有办
我有一个 cmake 项目,我想在其中添加一个包含 matlab 引擎的类。为了编译它,我需要包含两个库 eng和 mx ,我通过添加 target_link_libraries( ${TARGE
我是 Linux 新手。我在 CMakeLists.txt 中看到以下内容; target_link_libraries(app wiringPi
我有一个小型静态库,它需要 boost 头文件,并且需要包含目录中的“include”目录。 ... add_library(alib STATIC ...) target_include_direc
是否有任何用例 target_link_libraries(my-lib x y z) add_dependencies(my-lib x) # this is not just a waste of
我想知道默认的 target_link_libraries 隐私是什么。 我在 CMake 中添加了一行: target_link_libraries(myTarget library
出于多种原因,我必须通过自定义命令手动生成静态库。 但是,似乎自定义命令仅在目标明确请求其输出文件时才执行。 如果我尝试将生成的静态库与 target_link_libraries 链接起来, CMa
案例: 我已经声明了一个函数 setup_target_for_coverage在单独的 .cmake 脚本中,添加到 CMAKE_MODULE_PATH , 它为代码覆盖率分析准备了一个目标 ( m
假设我有一个可执行的 Alpha,它必须链接到一个共享库 Beta。 Beta 本身依赖于共享库 Gamma。 Gamma 对我来说已经存在,但我必须使用 cmake 自己编译 Alpha 和 Bet
我的项目中有很多库,还有很多单独的应用程序。我的一些库有依赖库,其中一些是外部库,我想要一种使应用程序 CMakeList.txt 文件更简单的方法。我希望使用宏来简化。 下面是一个大大简化的测试用例
我想为 C 代码测试创建模拟函数,并了解到在 target_link_libraries() 中可以选择包装函数,其工作方式类似于模拟,但不明白它是如何工作的? target_link_librari
我有一个示例库和两个符号链接(symbolic link): libname.so -> libname.so.3 libname.so.3 -> libname.so.3.0 当我使用此命令时: t
我一次又一次地与链接器问题作斗争,因为必须以正确的顺序指定 TARGET_LINK_LIBRARIES 中的所有库。但是我怎样才能确定这个顺序呢? 示例: 我有以下库 libA depends on
我正在使用 CMake 3.8.2(与 JetBrains CLion 一起提供)并链接自定义项目的几个静态库。 因为我需要保留静态符号(遗留),所以我将自己的程序部分包含在 target_link_
我有一个 CMake 多重定义链接问题,可执行文件依赖于包含静态库的共享库。 我创建了一个依赖于静态库 bar 的共享库 foo。 add_library(foo SHARED foo.cpp) ta
是否可以告诉 cmake 链接到 静态库 而不是 共享? 在我的 CMakeLists.txt 顶部,我配置了以下内容: set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CM
不知何故,我正在努力找出是否可以在 CMake 中定义导入的库,指定目标属性(include_directories 和库路径),并希望一旦我将该项目添加到另一个项目中的 target_link_li
我将开始声明我在 Cmake 问题上几乎完全是哑巴。 我有以下用于 Kdevelop 4.1 项目的 CMakeLists.txt: project(uart) find_package(KDE4 R
我是 CMake 新手,对与 target_link_libraries() 相关的 PUBLIC、PRIVATE 和 INTERFACE 关键字有点困惑。文档提到它们可用于在一个命令中指定链接依赖项
所以我在使用 CMake 构建我的软件时遇到了一个非常头疼的问题。 我正在静态构建第三方库 (dlib),它需要 zlib 和 libpng(两者都是静态的,我预先构建了这些)库来支持 PNG 功能。
我是一名优秀的程序员,十分优秀!