Makefile 为什么在构建共享库时,添加主函数为空的.cpp文件后,未定义的引用会消失

Makefile 为什么在构建共享库时,添加主函数为空的.cpp文件后,未定义的引用会消失,makefile,g++,undefined-reference,Makefile,G++,Undefined Reference,我有一个生成共享库libsimpletron.so的makefile: 然后我尝试使用这个库。我编译我的测试xor如下: #compiler CC = g++ #cpp flags FLAGS = -std=c++1z PUGI = -l pugixml #directories LIB_DIR = /home/lrdprdx/Projects/SimplePerceptron/lib SIMPLETRON = -lsimpletron ALGEBRA = -

我有一个生成共享库libsimpletron.so的makefile:

然后我尝试使用这个库。我编译我的测试xor如下:

#compiler
CC = g++
#cpp flags
FLAGS       = -std=c++1z
PUGI        = -l pugixml
#directories
LIB_DIR = /home/lrdprdx/Projects/SimplePerceptron/lib
SIMPLETRON  = -lsimpletron
ALGEBRA     = -lalgebra

XOR     = xor
SOURCE  = xor.cpp

#config file
CONFIG  = config.xml


$(XOR) : $(SOURCE) $(CONFIG)
    $(CC) $(FLAGS) -L$(LIB_DIR) $(SIMPLETRON) $(ALGEBRA) $(PUGI) -o $(XOR) $(SOURCE)
但当我试图编译它时,我得到了对…的未定义引用的错误。。。。好的,虽然我不明白为什么会出现这些错误,但我发现将带有空主函数的.cpp文件与其他.cpp文件一起添加到目录可以修复所有问题:

在重建共享库之后,我成功地创建并执行了xor。
问题是:这里发生了什么?

我怀疑添加额外文件是否真的修复了任何问题。很可能是其他副作用起了作用

你的问题是你的链接线不正确。与大多数UNIX链接器一样,GCC是单通道链接器。这意味着它一次只能遍历所有库以查找未解析的符号。这意味着链接器的参数顺序至关重要:您必须确保如果项目A引用项目B中的符号,那么A在链接行中位于B之前

在您的示例中,您将所有库放在第一位,源文件放在最后。所以,当make开始查看您的库时,它还没有看到您的源代码,并且没有需要链接的符号。当它编译您的源代码时,已没有库可用于解析符号

您的链接行应该首先与源文件和对象文件一起排列,然后是引用器中的库。。。参考顺序:

$(CC) $(FLAGS) $(SOURCE) -L$(LIB_DIR) $(SIMPLETRON) $(ALGEBRA) $(PUGI) -o $(XOR)
#compiler
CC = g++
#cpp flags
FLAGS       = -std=c++1z
PUGI        = -l pugixml
#directories
LIB_DIR = /home/lrdprdx/Projects/SimplePerceptron/lib
SIMPLETRON  = -lsimpletron
ALGEBRA     = -lalgebra

XOR     = xor
SOURCE  = xor.cpp

#config file
CONFIG  = config.xml


$(XOR) : $(SOURCE) $(CONFIG)
    $(CC) $(FLAGS) -L$(LIB_DIR) $(SIMPLETRON) $(ALGEBRA) $(PUGI) -o $(XOR) $(SOURCE)
//empty.cpp
int main()
{
    return 0;
}
$(CC) $(FLAGS) $(SOURCE) -L$(LIB_DIR) $(SIMPLETRON) $(ALGEBRA) $(PUGI) -o $(XOR)