2016-05-08 71 views
4

我想在C++中使用共享庫(也是我自己開發的)編寫一個示例程序,其名稱爲libtestlib.so嘗試編譯使用共享庫的C++程序時出錯

錯誤

我編的共享庫沒有問題,但是當我嘗試編譯使用該庫中的可執行文件,我有以下錯誤:iface/libtestlib.so: undefined reference to 'ALIB::function()'

我做了什麼

(在 $project_dir/lib1文件)

C++庫:

我做了以下

// 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,生成文件)

$project_dir/lib1alib.cppalib.h

$project_dir/ifaceiface.cpp, iface.h, libtestlib.so和所有通過cmake的生成。

$project_dir/mainmain.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) 
相關問題