解决方案是在g ++命令行上将生成的模块名称放在它依赖的其他模块之前。
g++ -fPIC -shared -o mymodule.so mymodule.cpp `pkg-config --cflags --libs python` `pkg-config --cflags --libs opencv` -I/usr/local/include/opencv2/legacy
gcc手册页中提到了该-l
选项,
在命令中写入此选项的位置会有所不同。链接器按照指定的顺序搜索和处理库和目标文件。因此,foo.o -lz bar.o
在文件foo.o之后但在bar.o之前搜索库z。如果bar.o引用z中的函数,则可能不会加载这些函数。
由于mymodule.so的名称是在应该链接到的库之前提供的,因此它们实际上都没有链接到生成的.so文件。
感谢@JFSebastian指出其-l
工作原理。