2016-05-08 5 views
4

Я пытаюсь скомпилировать примерную программу, которая использует совместно используемую библиотеку (также разработанную мной) в C++, имя которой равно libtestlib.so.Ошибка при попытке скомпилировать программу на C++, которая использует общую библиотеку

Ошибка

Я составил общую библиотеку без проблем, но когда я пытаюсь скомпилировать исполняемый файл, который использует эту библиотеку, у меня есть следующее сообщение об ошибке: iface/libtestlib.so: undefined reference to 'ALIB::function()'

То, что я сделал

я сделал следующие:

библиотеки C++ (файлы в $project_dir/lib1):

// HEADER 
#ifndef ALIB_H 
#define ALIB_H 

namespace ALIB{ 
    int function(); 
} 

#endif 
------------------------------------------- 
// SOURCE 
#include "alib.h" 

using namespace ALIB; 

int ALIB::function(){ 
    return 101; 
} 

: C интерфейс для C++ библиотеки (файлы в $project_dir/iface)

// HEADER 
#ifndef IFACE_H 
#define IFACE_H 

#include "alib.h" 

extern "C"{ 
    int IFACE_function(); 
} 

#endif 
-------------------------------- 
// SOURCE 
#include "iface.h" 

int IFACE_function(){ 
    return ALIB::function(); 
} 
-------------------------------------------------------- 
// CMakeLists used to build the library: 
cmake_minimum_required(VERSION 2.8) 
PROJECT(testlib) 
include_directories(../lib1) 
add_library(testlib SHARED iface.cpp) 

исполняемого файла, который использует библиотеку (файлы в $project_dir/main):

// SOURCE 
#include "iface.h" 
#include <iostream> 

using namespace std; 

int main(){ 
    cout << IFACE_function() << endl; 
} 

------------------------------------- 

// CMakeLists used to build the executable (file in `$project_dir`): 
cmake_minimum_required(VERSION 2.8) 
PROJECT(testlib) 
find_library(LIB NAMES testlib PATHS ./iface) 
include_directories(./lib1 ./iface) 
add_executable(testlib ./main/main.cpp) 
target_link_libraries(testlib ${LIB}) 

Создаваемые файлы

$project_dir: все произведено cmake. (CMakeLists.txt, CMakeCache, cmake_install.cmake, Makefile)

$project_dir/lib1: alib.cpp и alib.h

$project_dir/iface: iface.cpp, iface.h, libtestlib.so и все генерируется CMake.

$project_dir/main main.cpp.

Как дерево:

$project_dir 
├── CMakeCache.txt 
├── CMakeFiles 
│   ├── ... 
├── cmake_install.cmake 
├── CMakeLists.txt 
├── CMakeLists.txt~ 
├── iface 
│   ├── CMakeCache.txt 
│   ├── CMakeFiles 
│   │   ├── ... 
│   ├── cmake_install.cmake 
│   ├── CMakeLists.txt 
│   ├── CMakeLists.txt~ 
│   ├── iface.cpp 
│   ├── iface.h 
│   ├── libtestlib.so 
│   └── Makefile 
├── lib1 
│   ├── alib.cpp 
│   └── alib.h 
├── main 
│   └── main.cpp 
└── Makefile 
+0

Это вопрос линкер, а не ошибка компилятора. Можете ли вы просмотреть файлы o? – mousomer

+0

Ни один из показанных кодов не является C, так почему бы вам использовать C-интерфейс? – Olaf

+0

alib.cpp должен быть скомпилирован и связан. – Yuan

ответ

1

Благодаря комментарий Юань я нашел проблему. Мне нужно добавить файл alib.cpp в CMakeLists.txt, таким образом:

// CMakeLists used to build the library: 
cmake_minimum_required(VERSION 2.8) 
PROJECT(testlib) 
include_directories(../lib1) 
add_library(testlib SHARED iface.cpp ../lib1/alib.cpp)