C++ 在Linux上编译外部库
大家好, 注意-这个问题已经解决了-我在回答部分提供了我自己的解决方案,但是Jonathan提供的解决方案要短得多。然而,这是我最初发布的以下问题: 我基本上是在尝试在Linux上编译一个串行库(用于UART通信),但是我不确定如何正确编译(我在下面提到了我到目前为止所做的),任何建议都是非常有价值的。我正在使用serialib库-它由两个主文件(serialib.h和serialib.cpp)组成,您可以在此处直接查看这些文件的源代码(一直滚动到底部,并在新选项卡中查看文件): 我将这些文件(serialib.h和serialib.cpp)传输到运行Debian(Wheezy)、g++/gcc(Debian 4.6.3-14)4.6.3的BeagleBone Black微控制器。我编写了自己的程序(uart.cpp是我的文件名)来访问这个库提供的函数,我写的是:C++ 在Linux上编译外部库,c++,linux,compilation,g++,C++,Linux,Compilation,G++,大家好, 注意-这个问题已经解决了-我在回答部分提供了我自己的解决方案,但是Jonathan提供的解决方案要短得多。然而,这是我最初发布的以下问题: 我基本上是在尝试在Linux上编译一个串行库(用于UART通信),但是我不确定如何正确编译(我在下面提到了我到目前为止所做的),任何建议都是非常有价值的。我正在使用serialib库-它由两个主文件(serialib.h和serialib.cpp)组成,您可以在此处直接查看这些文件的源代码(一直滚动到底部,并在新选项卡中查看文件): 我将这些文件(
#include <iostream>
#include "serialib.h"
#ifdef __linux__
#define DEVICE_PORT "/dev/ttyO1"
#endif
int main()
{
serialib LS;
return 0;
}
#包括
#包括“serialib.h”
#ifdef_uuuLinux__
#定义设备\端口“/dev/ttyO1”
#恩迪夫
int main()
{
串行总线;
返回0;
}
如您所见,我正在尝试访问“seriallib”类。serialib.h、serialib.cpp和uart.cpp都在主目录中。我还在serialib.cpp中手动添加了iostream库,因为我没有看到它在原始源代码中声明
现在我真的不确定如何编译这样的外部库,但到目前为止,我尝试了以下步骤:
\u start'中:
(.text+0x30):未定义对
main'的引用
collect2:ld返回了1个退出状态
distcc[3210]错误:在本地主机上编译serialib.cpp失败
到现在为止,我仍然在寻找如何编译这个,如果我能解决这个问题,那么我也会在这里发布我的解决方案。再一次,任何建议都是非常有价值的。谢谢大家:)
g++-c-Wall-Werror-fPIC serialib.c
转换为PIC,出现以下错误:serialib.c
,并生成一个编译的对象文件serialib.o
g++serialib.cpp-L/home/debian/serialib.h
serialib.cpp
构建一个程序,并使用目录/home/debian/serialib.h
(不是目录!)查找库
您不需要“编译库”,只需编译两个源文件并将它们链接到一个程序中即可。要么:
g++ -c serialib.cpp
g++ -c uart.cpp
g++ serialib.o uart.o -o uart
或多功能一体式命令:
g++ serialib.cpp uart.cpp -o uart
您应该阅读以理解命令,而不是只输入虚假命令而不理解它们
g++-c-Wall-Werror-fPIC serialib.c
转换为PIC,出现以下错误:serialib.c
,并生成一个编译的对象文件serialib.o
g++serialib.cpp-L/home/debian/serialib.h
serialib.cpp
构建一个程序,并使用目录/home/debian/serialib.h
(不是目录!)查找库
您不需要“编译库”,只需编译两个源文件并将它们链接到一个程序中即可。要么:
g++ -c serialib.cpp
g++ -c uart.cpp
g++ serialib.o uart.o -o uart
或多功能一体式命令:
g++ serialib.cpp uart.cpp -o uart
您应该阅读以理解命令,而不仅仅是在不理解命令的情况下输入虚假命令。我已经找到了解决此问题的方法,希望这对所有将来遇到类似问题的读者有所帮助。我有我自己的源代码uart.cpp(在问题中给出),我想编译它,外部库是serialib,它包含两个主文件(serialib.h和serialib.cpp),您需要替换以下与您拥有的文件相关的命令 步骤1:使用位置无关代码编译 g++-c-Wall-Werror-fpic serialib.cpp 步骤2:创建共享库 g++-shared-o libserialib.so serialib.o,这里的库是libserialib.so 步骤3:将源代码与库链接 g++-L/home/debian-lserialib uart.cpp-o uart g++-L/home/debian-Wall-o测试uart.cpp-lserialib 您可以将库保存在不同的路径,当然,您也可以使用不同的名称。假设您在/home/user/myDir目录下有一个名为libabc.so的库,那么命令如下: g++-L/home/user/myDir-labc your_code.cpp-o your_code g++-L/home/user/myDir-Wall-o测试您的_代码.cpp-labc
test
是自己的程序,lserialib实际上是在寻找libserialib.so而不是serialib.o,因为gcc/g++假设所有库都以lib
开头,以.so或.a结尾,你可以看到labc和libabc的情况一样。因此,确保库名以lib