我写了一个非常好用的GCC插件。我创建了一个Makefile,它执行以下命令来创建插件:
$ g++ -I$(INCLUDE_PATHS) -fPIC -shared $(SOURCE_PATHS) -o Plugin.so
我使用以下命令执行插件:
$ g++ -S -fplugin=./Plugin.so /TestProgramm.cpp
这非常有效。现在我想在调用插件时显示QT GUI。我在Eclipse中编写了GUI,因此我得到了一个自动生成的MakeFile。执行GUI时,Eclipse执行以下命令:
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I$(QT_INCLUDE_PATHS) -o debug/GUI.o GUI.cpp
g++ -Wl,-rpath,/opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib -o GraphGUI debug/GUI.o debug/main.o debug/GraphGUI.o debug/moc_GraphGUI.o -L/opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib -lQtGui -L/opt/QtSDK/Desktop/Qt/4.8.1/gcc/lib -L/usr/X11R6/lib -lQtCore -lpthread
GraphGUI和GUI是我写的GUI的类。
现在我想在我自己的Makefile中组合这些语句,以便编译器编译我的插件和我的GUI。几天前我开始使用Makefiles,所以我只掌握了Makefiles的基础知识。希望有人可以帮助我。
这是我的Makefile:
GCC := g++
FILENAME := Explorer.so
GCC_INCLUDE := -I/usr/lib/gcc/i686-linux-gnu/4.6/plugin/include
QT_INCLUDE := -I/opt/QtSDK/Desktop/Qt/4.8.1/gcc/mkspecs/default \
-I/opt/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore \
-I/opt/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtGui \
-I/opt/QtSDK/Desktop/Qt/4.8.1/gcc/include
SOURCE_FILES = ## Some .cpp files for the plugin ##
$(FILENAME):
@$(GCC) $(GCC_INCLUDE) -fPIC -shared $(SOURCE_FILES) -o $@ $^
clean:
@rm $(FILENAME)
我尝试创建GUI的目标文件,然后将它们包含在创建插件的命令中;像这样:
$(GCC) -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED $(QT_INCLUDE) -Idebug -I. -o debug/GUI.o src/Visualize/GUI.cpp
$(GCC) -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED $(QT_INCLUDE) -Idebug -I. -o debug/GraphGUI.o src/Visualize/GraphGUI.cpp
# /opt/QtSDK/Desktop/Qt/4.8.1/gcc/bin/moc -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED $(QT_INCLUDE) -Idebug -I. src/Visualize/GraphGUI.h -o debug/moc_GraphGUI.cpp
# $(GCC) -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED $(QT_INCLUDE) -Idebug -I. -o debug/moc_GraphGUI.o debug/moc_GraphGUI.cpp
$(GCC) $(PLUGIN_INCLUDE) -fPIC -shared $(SOURCE_FILES) debug/GraphGUI.o debug/GUI.o -o $@ $^
如果我像这样执行它,我得到未定义的符号:_ZN11QMainWindowC2EP7QWidget6QFlagsIN2Qt10WindowTypeEE错误。如果我也执行以“#”开头的两个命令,我会得到“未定义的对main的引用”。我刚从eclipse复制了这些命令;我实际上并不知道他们在做什么。