指定定义先前在头文件中声明的函数的源文件

时间:2016-11-10 20:48:44

标签: c++

我有一堆C ++文件引用src/内的子目录中定义的函数。有没有办法通过g ++指定子目录中的cpp文件?

这是包的结构:

# SeqLib
#   |----src
#   |-----|---Makevars 
#   |-----|---rcpp_hello_world.cpp
#   |-----|---SeqLib(a submodule)
#   |-----|------|---SeqLib 
#   |-----|------|---FermiAssembler.h
#   |-----|------|---src 
#   |-----|------|---|----FermiAssembler.cpp

************************* 编辑 **************

运行-I../src/SeqLib/时,出现错误undefined symbol: _ZN6SeqLib14FermiAssemblerD1Ev。使用c ++ filt,符号引用在FermiAssembler.h中声明的析构函数,但是在FermiAssembler.cpp中定义

1 个答案:

答案 0 :(得分:3)

您必须将所有.cpp文件传递给编译器命令。强烈建议不要将.cpp个文件包含在其他.cpp个文件中。

可能适合您的命令行是:

g++ -ISeqLib -o my_executable rcpp_hello_world.cpp SeqLib/src/FermiAssembler.cpp

如果您有很多文件,建议您创建一个makefile脚本,以避免每次都重新编译所有代码。

如果您的FermiAssembler产品包含Makefile.am/in个文件,它可以使用configure脚本构建自己,该脚本可能在此处。一般的想法是:

cd SeqLib
./configure
make

如果它是库产品,则构建为.a.so文件。在这种情况下,命令行变为:

g++ -ISeqLib -o my_executable rcpp_hello_world.cpp SeqLib/bin/FermiAssembler.a

(我只是在输出库文件的路径和名称)

要包含.a文件,只需添加其路径即可。不确定SeqLib/bin/*.a是否会这样做,因为lib依赖项不遵循字母顺序。一个非常强大的功能就是两次指定所有 .a文件(因此lib-lib依赖项可以工作):

g++ -ISeqLib -o my_executable rcpp_hello_world.cpp SeqLib/bin/*.a SeqLib/bin/*.a
但是,最好只包括所需的.a文件,遵守以下顺序:首先是依赖于以下顺序的文件。最后一个库不得依赖任何先前的库。