如何更改automake的CXXLINK中的订单?

时间:2016-08-09 16:31:39

标签: c++ gcc linker autoconf automake

我正在尝试使用automake工具编译一个简单的C ++程序。 automake本身在其Makefile中创建了一行:CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@

然而,这样,我得到一些链接器错误,可以通过简单地将-o example example.cpp部分放在g ++命令的开头而不是结尾来解决。

如何指示automake将-o example example.cpp放在链接器命令前面?

以下是Makefile.am

bin_PROGRAMS = GLTest

GLTest_SOURCES = main.cpp

AM_CXXFLAGS=@gllibs_CFLAGS@ -std=c++11 -pthread
AM_LDFLAGS=@gllibs_LIBS@ -lGL -lGLEW -lglfw -lX11 -lXi -lXrandr

以下是链接器错误:

g++ -I/usr/include/libdrm -std=c++11 -pthread -g -O2 -lGLEW -lGLU -lGL -lglfw -lGL -lGLEW -lglfw -lX11 -lXi -lXrandr  -o GLTest main.o  
main.o: In function `main':
main.cpp:8: undefined reference to `glfwInit'
main.cpp:9: undefined reference to `glfwWindowHint'
main.cpp:10: undefined reference to `glfwWindowHint'
main.cpp:11: undefined reference to `glfwWindowHint'
main.cpp:12: undefined reference to `glfwWindowHint'
main.cpp:14: undefined reference to `glfwCreateWindow'
collect2: error: ld returned 1 exit status

当我像这样手动编译它时解决了这些问题:

g++ -o GLTest main.cpp -I/usr/include/libdrm -std=c++11 -pthread -g -O2 -lGLEW -lGLU -lGL -lglfw -lGL -lGLEW -lglfw -lX11 -lXi -lXrandr

2 个答案:

答案 0 :(得分:3)

你做错了。问题是您将库作为LDFLAGS传递,这是不正确的。

你应该

GLTest_LDADD = $(gllibs_LIBS)

这样您就可以正确告诉automake这些是库。

使用libtool 可能工作,具体取决于所使用的libtool版本,因为它可以对命令行进行排序,但它仍然是错误的,在其他情况下会失败。

答案 1 :(得分:0)

从输出中的链接器命令看起来您没有使用libtool

尝试将AM_PROG_LIBTOOL添加到configure.ac