【问题标题】:Clion & CMake. How To Add Library (*.so)克莱恩和 CMake。如何添加库 (*.so)
【发布时间】:2016-02-11 21:47:40
【问题描述】:

我正在尝试在 Clion IDE 中编写 (c/c++) 代码。我需要在我的项目中添加一些共享库。此时,我只想运行 main 函数,它将添加我的外部库 libAPIenergy.so 具有的所有函数。我尝试了这个论坛的一些解决方案,但都没有帮助。

下面我将介绍错误最少的解决方案。

在我的主要功能中包含

#include "APIenergy.h"

CMake 文件

cmake_minimum_required(VERSION 3.3)
project(TestProject)
add_library( libAPIenergy SHARED IMPORTED )
link_directories (/home/I/Lib/Linux/x86)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lAPIenergy ")
set(SOURCE_FILES main.cpp APIenergy.h)
add_executable(TestProject ${SOURCE_FILES})

和错误:

/home/I/clion-1.2/bin/cmake/bin/cmake --build /home/I/.CLion12/system/cmake/generated/9faec492/9faec492/Debug --target TestProject -- -j 8
[ 50%] Building CXX object CMakeFiles/TestProject.dir/main.cpp.o
[100%] Linking CXX executable TestProject
/usr/bin/ld: cannot find -lAPIenergy
collect2: error: ld returned 1 exit status
CMakeFiles/TestProject.dir/build.make:94${PROJECT_SOURCE_DIR}/P2PTunnelAPIs.h.in": polecenia dla obiektu 'TestProject' nie powiodły się
make[3]: *** [TestProject] Błąd 1
CMakeFiles/Makefile2:67: polecenia dla obiektu 'CMakeFiles/TestProject.dir/all' nie powiodły się
make[2]: *** [CMakeFiles/TestProject.dir/all] Błąd 2
CMakeFiles/Makefile2:79: polecenia dla obiektu 'CMakeFiles/TestProject.dir/rule' nie powiodły się
make[1]: *** [CMakeFiles/TestProject.dir/rule] Błąd 2
Makefile:118: polecenia dla obiektu 'TestProject' nie powiodły się
make: *** [TestProject] Błąd 2

我还使用我的共享库添加到系统 PATH LD_LIBRARY_PATH 目录

export LD_LIBRARY_PATH=$HOME/Lib/Linux/x86

.::编辑::. 1

我的CMake在你的建议之后

cmake_minimum_required(VERSION 3.3)
project(TestProject)
add_library(libAPIenergy SHARED IMPORTED)
SET_PROPERTY(TARGET libAPIenergy PROPERTY IMPORTED_LOCATION /home/I/x86/libAPIenergy.so)
target_link_libraries(TestProject libAPIEnergy)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp APIenergy.h)
add_executable(TestProject ${SOURCE_FILES})

来自 CMake 的错误

Error:Cannot specify link libraries for target "TestProject" which is not built by this project.

还有一件重要的事情。我将 APIenergy.h 文件部署到项目的主目录中。

.::EDIT 2::.

cmake_minimum_required(VERSION 3.3)
project(TestProject)
add_library(libAPIenergy SHARED IMPORTED)

target_link_libraries(TestProject libAPIenergy)
SET_PROPERTY(TARGET libAPIenergy PROPERTY IMPORTED_LOCATION /home/I/lib/x86/libAPIenergy.so)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp APIenergy.h)

add_executable(TestProject ${SOURCE_FILES})
target_link_libraries(TestProject libAPIenergy)

错误

Error:Cannot specify link libraries for target "TestProject" which is not built by this project.

.::EDIT 3::.

现在 CMake 文件没有错误

cmake_minimum_required(VERSION 3.3)
project(TestProject)
add_library(libAPIenergy SHARED IMPORTED)

SET_PROPERTY(TARGET libAPIenergy PROPERTY IMPORTED_LOCATION /home/I/lib/x86/libAPIenergy.so)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp APIenergy.h)

add_executable(TestProject ${SOURCE_FILES})
target_link_libraries(TestProject libAPIenergy)

我尝试过午餐的简单代码

#include <iostream>
#include "APIenergy.h" // include without error this mean without underlined

using namespace std;

int main() {

    int ret = APIenergyInitialize(5); // IDE suggestions name function so is looks good

    cout << "Hello, World!" << endl;
    return 0;
}

编译器出错

/home/I/clion-1.2/bin/cmake/bin/cmake --build /home/I/.CLion12/system/cmake/generated/9faec492/9faec492/Debug0 --target TestProject -- -j 8
[ 50%] Linking CXX executable TestProject
/home/I/lib/x86/libAPIenergy.so: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
CMakeFiles/TestProject.dir/build.make:95: polecenia dla obiektu 'TestProject' nie powiodły się
make[3]: *** [TestProject] Błąd 1
CMakeFiles/Makefile2:67: polecenia dla obiektu 'CMakeFiles/TestProject.dir/all' nie powiodły się
make[2]: *** [CMakeFiles/TestProject.dir/all] Błąd 2
CMakeFiles/Makefile2:79: polecenia dla obiektu 'CMakeFiles/TestProject.dir/rule' nie powiodły się
make[1]: *** [CMakeFiles/TestProject.dir/rule] Błąd 2
Makefile:118: polecenia dla obiektu 'TestProject' nie powiodły się
make: *** [TestProject] Błąd 2

【问题讨论】:

  • CMAKE_CXX_FLAGScompiler 标志,而不是 linker 标志。对于与库的链接可执行文件,您需要在add_executable() 调用之后发出target_link_libraries(TestProject libAPIenergy)。此外,对于 imported 库,您需要在 IMPORTED_LOCATION 属性中指定其位置(这在 add_librarydocumentation 中注明。
  • target_link_libraries() 调用应该在之后 add_executable()
  • 请仔细检查您的代码。目前您有 两个 target_link_libraries() 调用,其中一个位于add_executable() 之前。
  • 此错误消息告诉您您的库文件与您当前的架构不兼容。如果您在另一台机器上构建了库,通常会发生这种情况。这是常见的问题,请尝试谷歌它。
  • 尝试将此选项添加到CMAKE_CXX_FLAGS变量:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")

标签: c++11 cmake shared-libraries clion


【解决方案1】:

如果您要从源文件创建自己的库,请使用 add_library

如果您指定目标需要链接到其他人的库,请使用 target_link_libraries

【讨论】:

    猜你喜欢
    • 2018-03-22
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多