2015-11-10 13 views
0

Я пытаюсь написать код (c/C++) в Clion IDE. Мне нужно добавить к моему проекту некоторую общую библиотеку. В этот момент я хочу запустить просто программу (только главную функцию), которая сможет добавить любую функцию через мою внешнюю библиотеку libAPIenergy.so. Я пробовал несколько решений с этого форума, но никто ничего не помогает.Clion & CMake. Как добавить библиотеку (* .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 direcytory с моей общей библиотеки

export LD_LIBRARY_PATH=$HOME/Lib/Linux/x86 

. :: EDIT ::. 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 
+1

'CMAKE_CXX_FLAGS' - это * компилятор *, а не * линкер *. Для исполняемого файла с библиотекой вам нужно выпустить 'target_link_libraries (TestProject libAPIenergy)' после 'add_executable()' call. Кроме того, для * импортированной * библиотеки вам необходимо указать ее местоположение в свойстве «IMPORTED_LOCATION» (это отмечено в [документации] (https://cmake.org/cmake/help/v3.0/command/add_library.html) для 'add_library'. – Tsyvarev

+0

Пожалуйста, найдите основную запись Я его редактировал EDIT 1 – Mbded

+1

' target_link_libraries() 'call должен появляться ** после **' add_executable() '. – Tsyvarev

ответ

3

Используйте add_library, если вы создание вашей собственной библиотеки из исходных файлов.

Используйте target_link_libraries, если вы указываете, что ваша цель должна быть связана с библиотекой от кого-то другого.

Смежные вопросы