我有一个与Linker 在目标文件和静态库中共存相同符号时不会发出多个定义错误的问题非常密切相关,但涉及的情况略有不同。就像那里一样,我有两个 .cpp 文件(比如:test1.cpp
和test2.cpp
),每个文件都包含相同功能的实现,即void testfunc()
. 我还有一个头文件test.h
,我在其中声明testfunc
,以及一个main.cpp
带有 main 函数的文件,其中包含这样的调用testfunc()
:
include "test.h"
int main() {
testfunc();
}
Run Code Online (Sandbox Code Playgroud)
我通过调用分别编译 .cpp 文件g++ -c *.cpp
,然后使用ar rvs libtest.a test1.o test2.o
. 当链接main.o
对库现在,链接器不会抱怨,因为我希望它做的事:
gcc main.o -L. -ltest -o main
Run Code Online (Sandbox Code Playgroud)
生成的可执行文件工作得非常好 - 调用testfunc()
. 老实说,我预计multiple definition of...
会发生一些错误。因此,我的问题是:
ar
,它只将两个目标文件中的一个添加到库中,或者库是否包含两个目标文件,这种行为的原因是在链接过程中找到的,其中链接器在找到testfunc
? 的一个定义后停止搜索库。testfunc
实际使用的定义还是这个定义?即,它可能是ar
决定使用哪个参数的顺序?ar
或者这可能取决于系统?我正在和我一起工作boost::program_options
.我的程序应该作为任意长度的任意数量的"列表"作为参数(除其他外...).例如,用户应该能够打电话
./myprogram -list item1 item2 item3 -list item1 item2 -list item1 item2
Run Code Online (Sandbox Code Playgroud)
显然,我不希望一个接一个地获得一个列表/向量与所有项目,但是(在这种情况下)三个列表/向量(或者,例如,包含元素的向量的一个向量)每个列表有两个或三个项目(每个项目应该是一个字符串,但我想这没关系).正如我之前所说,列表的数量(以及每个列表的项目数量!)应该是任意的.我怎么能这样做boost::program_options
?