我有一堆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中定义
答案 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
文件,遵守以下顺序:首先是依赖于以下顺序的文件。最后一个库不得依赖任何先前的库。