Articles of cmake

如何设置CMakesearchpath

在我的CMakeLists.txt中 include (CheckFunctionExists.cmake) 当我运行ccmake (我正在按照官方教程 ) CMake Error at CMakeLists.txt:10 (include): include could not find load file: CheckFunctionExists.cmake 但是,我有指定的文件: sw3@pc90313-sw3:~/learn_cmake/build$ find / -name CheckFunctionExists.cmake 2>/dev/null /usr/share/cmake-2.8/Modules/CheckFunctionExists.cmake 我正在使用Ubuntu 13.04存储库的cmake安装forms: sw3@pc90313-sw3:~/learn_cmake/build$ cmake –version cmake version 2.8.10.1 如果指定了绝对path,那么一切正常,并生成一个工作的生成文件。 然而,这个解决方法远非理想(与教程不同)。 问题在哪里?

强制CMake使用完整的库path

我有以下问题。 我在我的Linux机器上有一个独立的{bin,lib,include}树,其中CMake和我的开发工作所需的所有库都被安装。 但是只有PATH环境variables被设置为这个bin目录,由于几个原因我不能设置LD_LIBRARY_PATH。 该树内的所有程序都是使用RPATH构build的。 我用的CMake 3.3.1也在这棵树里面。 现在我想用libcurl编译一个程序,并设置下面的CMakeLists.txt PROJECT(EXAMPLE) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) SET(CMAKE_SKIP_BUILD_RPATH FALSE) FIND_PACKAGE(CURL REQUIRED) FIND_PACKAGE(OpenSSL REQUIRED) INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}) SET(LIBS ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES}) ADD_EXECUTABLE(curl_ex src/curl_ex.c) TARGET_LINK_LIBRARIES(curl_ex ${LIBS}) 当我现在运行CMake curl和OpenSSL安装程序从我的个人软件树被发现,因为它驻留在CMake相同的前缀。 但是当我使用make VERBOSE=1来构build项目时,我看到下面的链接命令: gcc CMakeFiles/curl_ex.dir/src/curl_ex.co -o curl_ex -rdynamic -lcurl -lssl -lcrypto 而构build可执行文件是指系统范围内安装的curl和openssl库,而不是在configuration期间find的一个cmake库。 如何强制CMake使用它在执行链接时find的库?

在Antergos Linux上找不到“OPENSSL_1.0.0”

我正在Antergos Linux环境中开发Android工作室的应用程序。 一切正常,同步,build立和debugging。 一天前,一些更新,它不build立了。 源代码是完全一样的,我已经尝试将我的代码重置为旧的提交也是以前工作,所以我知道这个问题不是从我的代码。 Gradle同步消息是: Build command failed. Error while executing process /home/andre/Android/Sdk/cmake/3.6.3155560/bin/cmake with arguments {-H/home/andre/Development/Edru/edru-android/app -B/home/andre/Development/Edru/edru-android/app/.externalNativeBuild/cmake/debug/armeabi -GAndroid Gradle – Ninja -DANDROID_ABI=armeabi -DANDROID_NDK=/home/andre/Android/Sdk/ndk-bundle -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/home/andre/Development/Edru/edru-android/app/build/intermediates/cmake/debug/obj/armeabi -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=/home/andre/Android/Sdk/cmake/3.6.3155560/bin/ninja -DCMAKE_TOOLCHAIN_FILE=/home/andre/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-19 -DCMAKE_CXX_FLAGS=-std=c++11 -frtti -fexceptions} /home/andre/Android/Sdk/cmake/3.6.3155560/bin/cmake: /usr/lib/libcrypto.so.1.0.0: version `OPENSSL_1.0.0' not found (required by /home/andre/Android/Sdk/cmake/3.6.3155560/bin/cmake) /home/andre/Android/Sdk/cmake/3.6.3155560/bin/cmake: /usr/lib/libssl.so.1.0.0: version `OPENSSL_1.0.0' not found (required by /home/andre/Android/Sdk/cmake/3.6.3155560/bin/cmake) /home/andre/Android/Sdk/cmake/3.6.3155560/bin/cmake: /usr/lib/libssl.so.1.0.0: version `OPENSSL_1.0.1' not […]

cmake中“不允许源代码内部构build”

我是cmake的新手,我只是用它在我的ubuntu linux上安装opencv。 这是我跑的命令: "cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/home/jinha/OCV/source" 然后它返回错误: "FATAL: In-source builds are not allowed. You should create separate directory for build files." 我的当前目录/ home / jinha / OCV / build / opencv确实包含CMakefiles.txt文件,所以这不是问题。 我试图改变我的命令中的目录,但他们都提出了相同的错误。 我在这个问题上看到了其他的答案,所以我在每次运行这个命令之前都清除了CMakeFiles文件夹和CMakeCache.txt文件,但是没有一个能够工作。 谢谢。

如何在Linux上使用特定于Linux的API和库?

我有一个在Linux(主要)上运行的项目,但有时在Darwin / Mac OS X上运行。我使用CMake在Linux上生成Makefiles,在Mac OS X上生成Xcode项目。到目前为止,这一切都运行良好。 现在我想使用一些特定于Linux的函数( clock_gettime()和相关的函数)。 当我尝试使用clock_gettime()时,我在Mac OS X上遇到链接器错误,所以我认为它只在Linux上可用。 我准备在.c文件中引入条件编译的代码,以便在Linux上使用clock_gettime() ,在Mac OS上使用普通的旧clock() 。 (顺便说一下,我打算使用#include <unistd.h>和#if _POSIX_TIMERS > 0作为预处理器expression式,除非有人有更好的select。) 当涉及到CMakeLists.txt文件时,事情会变得棘手。 在跨平台CMake项目的Linux版本中,只有在Linux版本中引入链接到Linux专用API的首选方式是什么? 注意:这个问题的一个早期版本包含了对glibc的引用,这个引用过于具体和混乱。 问题实际上是在跨平台CMake项目中使用特定于Linux的API和库的正确方法。

使用CMake(而不是Qt Creator)为Android编译Qt应用程序

我在桌面上开发了一个Qt应用程序。 我使用Qt Creator将其移植到了Android上,并且工作正常。 我想用cmake编译应用程序。 编译应用程序到库(将ADD_EXECUTABLE更改为ADD_LIBRARY ) 用Qt java bootstrap连接它如何? build立最终APK(只是一个特殊的结构和文件的权利?) 安装在设备上( adb install ) 我可以做1,3(一些什么)和4.我需要帮助2注意:如果有人描述所有步骤这将是伟大的未来以及其他我自己纠正自己 不要使用Qt创build器的原因是:我不是每次编译所有东西(仅仅是因为1行代码改变了)的大爱好者,为了让我看起来好看的IDE,我的机器抖动,我也没有发现qmake非常有用并且非常有用。 Qt是我喜欢的一个很好的馅饼。 🙂 Qt 5.2.1 Linux localhost.localdomain 3.13.11-100.fc19.x86_64#1 SMP Wed Apr 23 20:10:57 UTC 2014 x86_64 x86_64 x86_64 GNU / Linux

cmake:target_link_libraries使用静态库不共享

是否有可能告诉cmake链接静态库而不是共享 ? 在我的CMakeLists.txt的顶部我有以下configuration: set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) 后来,我添加一个二进制文件,并告诉它在发布模式下与tcmalloc链接: target_link_libraries(${BIN_NAME} optimized tcmalloc_minimal) 由此产生的makefile链接aginst共享版本的tcmalloc : $ make VERBOSE=1 | grep tcmalloc /usr/bin/c++ … -Wl,-Bdynamic ltcmalloc_minimal 进一步certificate: $ ldd app … libtcmalloc_minimal.so.4 => /usr/local/lib/libtcmalloc_minimal.so.4 (0x00007eff89733000) … tcmalloc的静态和共享版本都存在: $ ls -1 /usr/local/lib/libtcmalloc_minimal* /usr/local/lib/libtcmalloc_minimal.a /usr/local/lib/libtcmalloc_minimal_debug.a /usr/local/lib/libtcmalloc_minimal_debug.la /usr/local/lib/libtcmalloc_minimal_debug.so /usr/local/lib/libtcmalloc_minimal_debug.so.4 /usr/local/lib/libtcmalloc_minimal_debug.so.4.2.6 /usr/local/lib/libtcmalloc_minimal.la /usr/local/lib/libtcmalloc_minimal.so /usr/local/lib/libtcmalloc_minimal.so.4 /usr/local/lib/libtcmalloc_minimal.so.4.2.6 题: 我如何configurationcmake链接到静态版本的tcmalloc ?

cmake – 让子目录使用自己的Makefile

我有一个主要使用CMake的项目。 但是,有一个来自第三方/旧式库的子目录。 它有一个Makefile,将自己编译成一个3rd_party.a库文件。 我自己的CMakeLists.txt可以设法调用Makefile,生成3rd_party.a库,并让我的代码链接到它? 我不想将其传统Makefile调整为CMakeLists.txt ├── my_source_folder_1 ├── my_source_folder_2 ├── CMakeLists.txt ├── 3rd_party │ ├── 3rd_party_source │ ├── 3rd_party_make │ | ├── Makefile 谢谢!

编辑CMakeLists.txt与-fPIC编译

我正在尝试安装名为libnifalcon的NOVINT Falcon的驱动程序。 我用cmake来创build一个make文件,但是当我运行make时,我得到错误: Linking CXX shared library ../../lib/libnifalcon_cli_base.so /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_program_options-mt.a(cmdline.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libboost_program_options-mt.a: could not read symbols: Bad value collect2: ld returned 1 exit status make[2]: ** [lib/libnifalcon_cli_base.so.1.0.1] Error 1 make[1]: ** [src/util/CMakeFiles/nifalcon_cli_base_SHARED.dir/all] Error 2 make: *** [all] Error 2 我已经尝试了许多技术来编译usinf […]

使用cmakeconfiguration代码覆盖率

我在一台linux机器上,试图使用cmake来构build一个没有源代码的项目。 对于代码覆盖范围,我查看了gcov,然后使用了一个简单的教程,为示例helloWorld.cpp程序生成相应的文件。 唯一的要求是用-fprofile-arcs -ftest-coverage标志和带-lgcov标志的链接进行-lgcov ,这可以用-coverage标志完成。 现在来棘手的部分。 我有一个CMakeLists.txt智慧内容如下所示: cmake_minimum_required (VERSION 2.8) project (SomeName) SET(GCC_COVERAGE_COMPILE_FLAGS "-g -O0 -coverage -fprofile-arcs -ftest-coverage") SET(GCC_COVERAGE_LINK_FLAGS "-coverage -lgcov") SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" ) SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" ) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) include_directories(include) set(CATCH_HEADER_PATH ${PROJECT_SOURCE_DIR}/test/catch.hpp) add_executable(runTest ${PROJECT_SOURCE_DIR}/test/test.cpp ${CATCH_HEADER_PATH}) 所以我已经包括适当的编译时间标志以及链接器标志,并正确地附加它们。 另一件需要注意的是set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)行,表示可执行文件将在bin目录内生成。 现在一切正常,除非覆盖文件没有正确生成。 我遵循这些步骤: mkdir build && cd build cmake .. make -j4 ./bin/runTest bin文件夹内不会生成其他文件。 […]