我正在尝试在Clion IDE中编写(c/c++)代码。我需要将一些共享库添加到我的项目中。目前,我只想运行主函数,它将添加我的外部库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
我还将我的共享库所在的LD_LIBRARY_PATH目录添加到系统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 文件部署到了项目的主目录。
.::编辑 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.
.::编辑 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_FLAGS
是编译器标志,而不是链接器标志。要将可执行文件与库链接起来,您需要在add_executable()
调用之后使用target_link_libraries(TestProject libAPIenergy)
命令。此外,对于导入的库,您需要在IMPORTED_LOCATION
属性中指定其位置(这在文档的add_library
部分有说明)。 - Tsyvarevtarget_link_libraries()
调用应该在add_executable()
之后。 - Tsyvarevtarget_link_libraries()
调用,其中一个位于add_executable()
之前。 - TsyvarevCMAKE_CXX_FLAGS
变量中:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
。 - Tsyvarev