2016-05-08 72 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) 
相关问题