使用g ++编译静态库

时间:2018-01-04 14:54:11

标签: linux

我有3个课程 - 我用firstClasssecondClassthirdClass来表示这些课程。 我的标题 - firstClass.hsecondClass.hthirdClass.h和来源firstClass.cppsecondClass.cppthirdClass.cpp。 在课程thirdClass中,我创建了firstClass的实例和secondClass的两个实例。 在main.cpp我解构并创建实例thirdClass

我想创建thirdclass的静态库并链接到main.cppfirstClassthirdClass使用了相同的库libm.a

我按照以下步骤逐步创建了库:

  1. g++ -c -I-/usr/include/ -I-/usr/lib/ -I-/home/projects/Learninig firstClass.cpp -lstdc++ -lm-o WsChannel.o -w -m32
  2. g++ -c -I-/usr/include/ -I-/usr/lib/ --I-/home/projects/Learninig secondClass -lstdc++ -o secondClass.o -w -m32
  3. g++ -c -I-/usr/include/ -I-/usr/lib/ --I-/home/projects/Learninig thirdClass.cpp -lstdc++ -lm -o thirdClass.o -w -m32
  4. ar rcs libLearning.a firstClass.o secondClass.o thirdClass.o
  5. g++ main.cpp -L. -lLearning -lm -o MnLearning.o -m32
  6. 正确编译没有任何错误,但是当我执行程序时,我有同样的错误。我花了几个小时检查代码,但我没有发现错误。那么编译可能不正确。我在网上使用了一些教程。 如果不清楚的话,我准备更多地解释我的问题。

    编辑:我的错误: segfault at 557400000045 ip 00005574bd509dcd sp 00007ffd9e887900 error 4 in MnLearning[5574bd4f2000+26000]

1 个答案:

答案 0 :(得分:1)

错误肯定在您自己的源代码中。避免使用undefined behavior,并且是UB的scared

您对-I-的使用很奇怪,可能是错误的。我建议删除它(如果你的计算机和发行版是64位,首先删除-m32标志;首先让你的程序在你的笔记本电脑上正确运行,然后再将它移植到32位Linux -m32标志。您可以使用preprocessor options之类的-H来显示包含的文件。

我建议使用build automationGNU makeninja工具构建您的库和您的程序。

将您的构建配置为使用所有警告和调试信息进行编译,即使用g++ -Wall -Wextra -gGCC。改进您的源代码以获得警告。然后use the gdb debugger了解程序(和库)的行为。

  

那么编译可能不正确。

不,编译器可能很好,你应该相信它。

该错误很可能出现在您自己的代码中。

  

我的错误:段错误557400000045 ip 00005574bd509dcd sp 00007ffd9e887900 MnLearning中的错误4 [5574bd4f2000 + 26000]

Segmentation fault是您自己的代码中某些错误的症状(例如,某些缓冲区溢出,某些错误的指针取消引用等;或其他类型的UB)。

您也可以使用valgrind

  

我花了几个小时检查代码,但我没有发现错误。

你没有花足够的时间(一些错误可能会花费你数周的工作时间),你忘了使用调试器,这是一个非常方便的工具,可以帮助你理解程序的行为并找到它中的错误。请注意programming is difficult,不要气馁。