尝试构建 xerces c++ 解析器。 Netbeans 和命令行构建错误未定义对“xercesc_3_2...”的引用
Attempting to build xerces c++ parser. Netbeans & command line build error undefined reference to `xercesc_3_2...'
我正在尝试在基于 Linux RedHat 的 NetBeans 项目中使用 Xerces c++ 解析器库。
我遵循了构建指南 (https://xerces.apache.org/xerces-c/build-3.html#UNIX)
1) 下载了 tar.gz "xerces-c-3.2.2.tar.gz"
2) 使用“tar xvzf”提取到 tar 用户我的 /home/myuser/projects 作为 xerces-c-3.2.2
3) 导航到 /home/myuser/projects/xerces-c-3.2.2 并在 linux
上的命令行发出
./configure --disable-shared --disable-static
有很多输出但没有错误,下一个:
4) 我运行"make"在同一个目录下。创建了很多 .o 和 .lo 文件...
输出是这样的:
CXX src/SEnumVal/SEnumVal.o
CXXLD SEnumVal
CXX src/StdInParse/StdInParse.o
CXX src/StdInParse/StdInParseHandlers.o
CXXLD StdInParse
CXX src/XInclude/XInclude.o
CXXLD XInclude
make[2]: Leaving directory `/home/myUser/projects/xerces-c-3.2.2/samples'
make[2]: Entering directory `/home/myUser/projects/xerces-c-3.2.2'
make[2]: Leaving directory `/home/myUser/projects/xerces-c-3.2.2'
make[1]: Leaving directory `/home/myUser/projects/xerces-c-3.2.2'
没有错误,下一个:
5) cd /src & ls -a 显示 .libs 目录已构建。
cd 进入 /home/myUser/projects/xerces-c-3.2.2/src/.libs 显示:
libxerces-c.a libxerces-c.la libxerces-c.lai
6) 尝试 运行 示例代码,基于编程指南 (http://xerces.apache.org/xerces-c/program-3.html):
#include <xercesc/util/PlatformUtils.hpp>
// Other include files, declarations, and non-Xerces-C++ initializations.
using namespace xercesc;
int main(int argc, char* argv[])
{
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
// Do your failure processing here
return 1;
}
// Do your actual work with Xerces-C++ here.
XMLPlatformUtils::Terminate();
// Other terminations and cleanup.
return 0;
}
在按下项目属性之前,c++ 编译器,包含目录并添加以下路径
1)../../projects/xerces-c-3.2.2/src/xercesc
2)../../projects/xerces-c-3.2.2/src
3)../../projects/xerces-c-3.2.2/src/.libs
并包含到 headers 的路径:
1) ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp
2) ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp
3) ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp
我也去了项目属性,链接器并添加了"Additional Library Directories" & "Runtime Search Directories"
1)../../projects/xerces-c-3.2.2/src/xercesc
2)../../projects/xerces-c-3.2.2/src
3)../../projects/xerces-c-3.2.2/src/.libs
最后我在 Netbeans 中按下清理和构建,报告了编译器命令和错误:
cd '/home/myUser/NetBeansProjects/SOFF_test'
/usr/bin/gmake -f Makefile CONF=Debug clean
"/usr/bin/gmake" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf
gmake[1]: Entering directory `/home/myUser/NetBeansProjects/SOFF_test'
rm -f -r build/Debug
gmake[1]: Leaving directory `/home/myUser/NetBeansProjects/SOFF_test'
CLEAN SUCCESSFUL (total time: 209ms)
cd '/home/myUser/NetBeansProjects/SOFF_test'
/usr/bin/gmake -f Makefile CONF=Debug
"/usr/bin/gmake" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
gmake[1]: Entering directory `/home/myUser/NetBeansProjects/SOFF_test'
"/usr/bin/gmake" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux/soff_test
gmake[2]: Entering directory `/home/myUser/NetBeansProjects/SOFF_test'
mkdir -p build/Debug/GNU-Linux
rm -f "build/Debug/GNU-Linux/newmain.o.d"
g++ -c -g -I../../projects/xerces-c-3.2.2/src/xercesc -I../../projects/xerces-c-3.2.2/src -include ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp -MMD -MP -MF "build/Debug/GNU-Linux/newmain.o.d" -o build/Debug/GNU-Linux/newmain.o newmain.cpp
mkdir -p dist/Debug/GNU-Linux
g++ -o dist/Debug/GNU-Linux/soff_test build/Debug/GNU-Linux/newmain.o -L../../projects/xerces-c-3.2.2/src/ -L../../projects/xerces-c-3.2.2/src/xercesc/ -L../../projects/xerces-c-3.2.2/src/.libs -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/xercesc/util/'
build/Debug/GNU-Linux/newmain.o:
In function `main':
/home/myUser/NetBeansProjects/SOFF_test/newmain.cpp:26: undefined reference to `xercesc_3_2::XMLUni::fgXercescDefaultLocale'
/home/myUser/NetBeansProjects/SOFF_test/newmain.cpp:26: undefined reference to `xercesc_3_2::XMLPlatformUtils::Initialize(char const*, char const*, xercesc_3_2::PanicHandler*, xercesc_3_2::MemoryManager*)'
/home/myUser/NetBeansProjects/SOFF_test/newmain.cpp:36: undefined reference to `xercesc_3_2::XMLPlatformUtils::Terminate()'
build/Debug/GNU-Linux/newmain.o:(.gcc_except_table+0x10): undefined reference to `typeinfo for xercesc_3_2::XMLException'
collect2: error: ld returned 1 exit status
gmake[2]: *** [dist/Debug/GNU-Linux/soff_test] Error 1
gmake[2]: Leaving directory `/home/myUser/NetBeansProjects/SOFF_test'
gmake[1]: *** [.build-conf] Error 2
gmake[1]: Leaving directory `/home/myUser/NetBeansProjects/SOFF_test'
gmake: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 456ms)
如果参考g++编译命令:
g++ -c -g -I../../projects/xerces-c-3.2.2/src/xercesc -I../../projects/xerces-c-3.2.2/src -include ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp -MMD -MP -MF "build/Debug/GNU-Linux/newmain.o.d" -o build/Debug/GNU-Linux/newmain.o newmain.cpp
g++ -o dist/Debug/GNU-Linux/soff_test build/Debug/GNU-Linux/newmain.o -L../../projects/xerces-c-3.2.2/src/ -L../../projects/xerces-c-3.2.2/src/xercesc/ -L../../projects/xerces-c-3.2.2/src/.libs -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/xercesc/util/'
build/Debug/GNU-Linux/newmain.o:
您可以看到包含示例代码的 headers:
-include ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp
还为链接器提供了 .libs 和 src(可能不需要)文件夹
-L../../projects/xerces-c-3.2.2/src/ -L../../projects/xerces-c-3.2.2/src/xercesc/ -L../../projects/xerces-c-3.2.2/src/.libs
NetBeans 能够看到 #include <xercesc/util/PlatformUtils.hpp>
& 我什至可以点击 xerces PlatformUtils.hpp & 通过 IDE 查看函数实现。
1) 为什么 NetBeans 无法编译和找到 Xerces 库,即使 IDE 可以解析 headers?
2) 最后,我该如何解决这个问题? (我的包含正确吗?)
更新:
上述原始错误 "undefined references" 已根据用户 "jww" 的建议解决,请参阅评论。
1) 我 ch 将 #include 更改为 #include "xercesc/util/PlatformUtils.hpp"
2) 还通过项目属性、链接器、库菜单添加了 libxerces-c.a。
这些是 NetBeans 生成的更新的构建命令:
g++ -c -g -I../../projects/xerces-c-3.2.2/src/xercesc -I../../projects/xerces-c-3.2.2/src -I../../projects/xerces-c-3.2.2/src/.libs -include ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp -MMD -MP -MF "build/Debug/GNU-Linux/newmain.o.d" -o build/Debug/GNU-Linux/newmain.o newmain.cpp
mkdir -p dist/Debug/GNU-Linux
g++ -o dist/Debug/GNU-Linux/soff_test build/Debug/GNU-Linux/newmain.o -L../../projects/xerces-c-3.2.2/src/ -L../../projects/xerces-c-3.2.2/src/xercesc/ -L../../projects/xerces-c-3.2.2/src/.libs -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/.libs' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/xercesc' -lxerces-c
可以看到添加了-lxerces-c标志
现在我自然有新的错误,这些错误与示例代码无关,但在 xerces 库代码的深处,它们又是 "undefined references" 性质的。
See below:
/home/anaim/projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.cpp:70: undefined reference to `curl_global_init'
/home/anaim/projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.cpp:70: undefined reference to `curl_global_init'
../../projects/xerces-c-3.2.2/src/.libs/libxerces-c.a(CurlNetAccessor.o): In function `xercesc_3_2::CurlNetAccessor::cleanupCurl()':
/home/anaim/projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.cpp:78: undefined reference to `curl_global_cleanup'
../../projects/xerces-c-3.2.2/src/.libs/libxerces-c.a(CurlURLInputStream.o): In function `xercesc_3_2::CurlURLInputStream::readMore(int*)':
/home/anaim/projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp:269: undefined reference to `curl_multi_perform'
Etc, etc...
我还通过添加 -lcurl 和 -lpthread
解决了上述错误和更多错误
这是最新的编译命令(同样是它的 NetBeans 生成的)
g++ -c -g -I../../projects/xerces-c-3.2.2/src/xercesc -I../../projects/xerces-c-3.2.2/src -include ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/Transcoders/ICU/ICUTransService.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/xinclude/XIncludeLocation.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/xinclude/XIncludeUtils.hpp -MMD -MP -MF "build/Debug/GNU-Linux/newmain.o.d" -o build/Debug/GNU-Linux/newmain.o newmain.cpp
mkdir -p dist/Debug/GNU-Linux
g++ -o dist/Debug/GNU-Linux/soff_test build/Debug/GNU-Linux/newmain.o -L../../projects/xerces-c-3.2.2/src/ -L../../projects/xerces-c-3.2.2/src/xercesc/ -L../../projects/xerces-c-3.2.2/src/.libs -Wl,-rpath,'../../projects/xerces-c-3.2.2/src' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/xercesc' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/.libs' -lxerces-c -lcurl -lpthread
新错误:
再次 "undefined references":
../../projects/xerces-c-3.2.2/src/.libs/libxerces-c.a(ICUTransService.o): 在函数xercesc_3_2::ICUTransService::upperCase(unsigned short*)':
/home/anaim/projects/xerces-c-
3.2.2/src/xercesc/util/Transcoders/ICU/ICUTransService.cpp:358: undefined reference to
u_toupper_50'
等等...
1) 那么我是否必须重复相同的步骤并将 headers 添加到路径中直到这些问题得到解决?
这似乎是 NetBeans 的问题?
如果开发人员提供库的写入路径(在本例中为 xerces)并且 NetBeans 能够看到该库(它确实如此),为什么 NetBeans 不能生成正确的 compiler/linker 命令,这不是整点了一个C/C++IDE?
我最近的尝试:
我已经开始使用不依赖于 NetBeans 的自定义 Makefile。
这里是 Makefile:
# vars c++
CXX := g++
CXXFLAGS := -std=c++11 -Wall -g
#collect all c++ files $(wildcard *.cpp)
SOURCES_CC = newmain.cpp
#vars c
CC := gcc
CFLAGS := -std=c99 -Wall -g
#collect all c files
SOURCES_C := $(wildcard *.c)
#objects
OBJECTS_DIR := build
#construct objects from .c and .cpp to .o
OBJECTS := $(SOURCES_C:%.c=%.o) $(SOURCES_CC:%.cpp=%.o)
#final executable in dist
DIST_DIR := dist
PROGRAM := $(DIST_DIR)/main
#required libraries
LDFLAGS = -L../../projects/xerces-c-3.2.2/src/xercesc/ -lxerces-c
debug := CFLAGS
.PHONY: all
all debug: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(CXX) -o $@ $(OBJECTS) $(LDFLAGS)
.PHONY: clean
clean:
rm -f $(PROGRAM) $(OBJECTS)
这是最新的错误:
cd '/home/myuser/NetBeansProjects/SOFF_test'
/usr/bin/gmake -f Makefile CONF=Debug
gmake: *** No rule to make target `-I../../projects/xerces-c-3.2.2/src/xercesc', needed by `dist/main'. Stop.
我能够使用此命令行构建 xerces:
g++ -std=c++11 -Wall -g -L../../projects/xerces-c-3.2.2/src/xercesc/ -o main newmain.cpp -lxerces-c
**这是我唯一的问题!如何更改此自定义 Makefile 以使用我自己的源文件(.c 和 .cpp)构建示例 xerces 示例
万分感谢!
在您的自定义 makefile 中,这一行
$(PROGRAM): $(INCLUDES) $(OBJECTS)
不正确。您告诉 make 您的程序依赖于目标文件 和告诉编译器包含文件所在位置的预处理器选项 。 -I../../projects/xerces-c-3.2.2/src/xercesc
不是您的可执行文件所依赖的文件。
从该行中删除 $(INCLUDES)
并将其用作预处理器选项:
CPPFLAGS := $(INCLUDES)
$(PROGRAM): $(OBJECTS)
$(CXX) -o $@ $(OBJECTS) $(LDFLAGS)
您的 LDFLAGS
中可能需要一个 -L../../projects/xerces-c-3.2.2/src/xercesc/
。
注意:您正在使用 SOURCES_CC
变量,但没有在任何地方定义它。
A well-meaning 版主 'Cody' 删除了这个(下方)答案而没有解释,即使它是正确答案的一部分。简而言之,伙计问的是 his/her 自定义 makefile,而不是 Netbeans 生成的东西。
我还注意到一个人关于从 object 的构建依赖项中删除“.d”文件的回复。通常(但不总是)这些是在编译后更新的,但它们也需要在初始编译发生之前构建。简单地从 objects 依赖项中删除它们可能意味着如果 headers 中有任何更改,受影响的 objects 可能不会重建,即使它们依赖于那些 headers。这是一种 chicken-egg 悖论,解决它的方法是构建一个特殊目标,如 'depend' .. 即 'make depend'。我没有在 Makefile 片段中看到这个目标,但也许我错过了?另一种不太常见的方法是制作一个像 'NODEPS' 这样的宏,它在 makefile 中添加一些条件到 avoid/skip 添加 '.d' 文件作为依赖项。因此,您会在初始构建时执行 'make NODEPS=1',然后在随后的 'make ' 构建中出现 'chicken'。
这是his/her最后一个问题:这是我唯一的问题!如何更改此自定义 Makefile 以构建示例:xerces 示例以及我自己的源文件(.c 和 .cpp)?
如果您从 /home/myuser/NetBeansProjects/SOFF_test 目录中执行 'ls ../../projects/xerces-c-3.2.2/src/xercesc' .. 它是否找到该目录,换句话说,从您所在的位置开始的相对路径是否有效 运行 编译器?如果不是,那么您需要对其进行更改 - 它可能就像在其中添加一个额外的 ../ 一样简单,例如 -
包括:= -I../../../projects/xerces-c-3.2.2/src/xercesc -I../../../projects/xerces-c-3.2.2/src -包括../../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -包括../../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp -MMD -MP -MF "build/Debug/GNU-Linux/newmain.o.d"
根据您的评论,这是一个简单的 makefile .. 希望这对您有所帮助:)
CC = gcc
CXX = g++
CFLAGS = -std=c99 -Wall
CXXFLAGS = -std=c++11 -Wall
PROGRAM = dist/main
SOURCES_C = $(wildcard *.c)
SOURCES_CC = newmain.cpp
OBJS = $(SOURCES_C:%.c=%.o) $(SOURCES_CC:%.cpp=%.o)
LIBS = -L../../projects/xerces-c-3.2.2/src/xercesc/ -lxerces-c
all: $(PROGRAM)
clean:
rm -f $(PROGRAM) $(OBJS)
%.o : %.c
$(CC) -c $(CFLAGS) $<
%.o : %.cpp
$(CXX) -c $(CXXFLAGS) $<
$(PROGRAM): $(OBJS)
$(CXX) -o $@ $(OBJS) $(LIBS)
.PHONY: all clean
我正在尝试在基于 Linux RedHat 的 NetBeans 项目中使用 Xerces c++ 解析器库。
我遵循了构建指南 (https://xerces.apache.org/xerces-c/build-3.html#UNIX)
1) 下载了 tar.gz "xerces-c-3.2.2.tar.gz"
2) 使用“tar xvzf”提取到 tar 用户我的 /home/myuser/projects 作为 xerces-c-3.2.2
3) 导航到 /home/myuser/projects/xerces-c-3.2.2 并在 linux
上的命令行发出./configure --disable-shared --disable-static
有很多输出但没有错误,下一个:
4) 我运行"make"在同一个目录下。创建了很多 .o 和 .lo 文件...
输出是这样的:
CXX src/SEnumVal/SEnumVal.o
CXXLD SEnumVal
CXX src/StdInParse/StdInParse.o
CXX src/StdInParse/StdInParseHandlers.o
CXXLD StdInParse
CXX src/XInclude/XInclude.o
CXXLD XInclude
make[2]: Leaving directory `/home/myUser/projects/xerces-c-3.2.2/samples'
make[2]: Entering directory `/home/myUser/projects/xerces-c-3.2.2'
make[2]: Leaving directory `/home/myUser/projects/xerces-c-3.2.2'
make[1]: Leaving directory `/home/myUser/projects/xerces-c-3.2.2'
没有错误,下一个:
5) cd /src & ls -a 显示 .libs 目录已构建。
cd 进入 /home/myUser/projects/xerces-c-3.2.2/src/.libs 显示:
libxerces-c.a libxerces-c.la libxerces-c.lai
6) 尝试 运行 示例代码,基于编程指南 (http://xerces.apache.org/xerces-c/program-3.html):
#include <xercesc/util/PlatformUtils.hpp>
// Other include files, declarations, and non-Xerces-C++ initializations.
using namespace xercesc;
int main(int argc, char* argv[])
{
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
// Do your failure processing here
return 1;
}
// Do your actual work with Xerces-C++ here.
XMLPlatformUtils::Terminate();
// Other terminations and cleanup.
return 0;
}
在按下项目属性之前,c++ 编译器,包含目录并添加以下路径
1)../../projects/xerces-c-3.2.2/src/xercesc
2)../../projects/xerces-c-3.2.2/src
3)../../projects/xerces-c-3.2.2/src/.libs
并包含到 headers 的路径:
1) ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp
2) ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp
3) ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp
我也去了项目属性,链接器并添加了"Additional Library Directories" & "Runtime Search Directories"
1)../../projects/xerces-c-3.2.2/src/xercesc
2)../../projects/xerces-c-3.2.2/src
3)../../projects/xerces-c-3.2.2/src/.libs
最后我在 Netbeans 中按下清理和构建,报告了编译器命令和错误:
cd '/home/myUser/NetBeansProjects/SOFF_test'
/usr/bin/gmake -f Makefile CONF=Debug clean
"/usr/bin/gmake" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf
gmake[1]: Entering directory `/home/myUser/NetBeansProjects/SOFF_test'
rm -f -r build/Debug
gmake[1]: Leaving directory `/home/myUser/NetBeansProjects/SOFF_test'
CLEAN SUCCESSFUL (total time: 209ms)
cd '/home/myUser/NetBeansProjects/SOFF_test'
/usr/bin/gmake -f Makefile CONF=Debug
"/usr/bin/gmake" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
gmake[1]: Entering directory `/home/myUser/NetBeansProjects/SOFF_test'
"/usr/bin/gmake" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux/soff_test
gmake[2]: Entering directory `/home/myUser/NetBeansProjects/SOFF_test'
mkdir -p build/Debug/GNU-Linux
rm -f "build/Debug/GNU-Linux/newmain.o.d"
g++ -c -g -I../../projects/xerces-c-3.2.2/src/xercesc -I../../projects/xerces-c-3.2.2/src -include ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp -MMD -MP -MF "build/Debug/GNU-Linux/newmain.o.d" -o build/Debug/GNU-Linux/newmain.o newmain.cpp
mkdir -p dist/Debug/GNU-Linux
g++ -o dist/Debug/GNU-Linux/soff_test build/Debug/GNU-Linux/newmain.o -L../../projects/xerces-c-3.2.2/src/ -L../../projects/xerces-c-3.2.2/src/xercesc/ -L../../projects/xerces-c-3.2.2/src/.libs -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/xercesc/util/'
build/Debug/GNU-Linux/newmain.o:
In function `main':
/home/myUser/NetBeansProjects/SOFF_test/newmain.cpp:26: undefined reference to `xercesc_3_2::XMLUni::fgXercescDefaultLocale'
/home/myUser/NetBeansProjects/SOFF_test/newmain.cpp:26: undefined reference to `xercesc_3_2::XMLPlatformUtils::Initialize(char const*, char const*, xercesc_3_2::PanicHandler*, xercesc_3_2::MemoryManager*)'
/home/myUser/NetBeansProjects/SOFF_test/newmain.cpp:36: undefined reference to `xercesc_3_2::XMLPlatformUtils::Terminate()'
build/Debug/GNU-Linux/newmain.o:(.gcc_except_table+0x10): undefined reference to `typeinfo for xercesc_3_2::XMLException'
collect2: error: ld returned 1 exit status
gmake[2]: *** [dist/Debug/GNU-Linux/soff_test] Error 1
gmake[2]: Leaving directory `/home/myUser/NetBeansProjects/SOFF_test'
gmake[1]: *** [.build-conf] Error 2
gmake[1]: Leaving directory `/home/myUser/NetBeansProjects/SOFF_test'
gmake: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 456ms)
如果参考g++编译命令:
g++ -c -g -I../../projects/xerces-c-3.2.2/src/xercesc -I../../projects/xerces-c-3.2.2/src -include ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp -MMD -MP -MF "build/Debug/GNU-Linux/newmain.o.d" -o build/Debug/GNU-Linux/newmain.o newmain.cpp
g++ -o dist/Debug/GNU-Linux/soff_test build/Debug/GNU-Linux/newmain.o -L../../projects/xerces-c-3.2.2/src/ -L../../projects/xerces-c-3.2.2/src/xercesc/ -L../../projects/xerces-c-3.2.2/src/.libs -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/xercesc/util/'
build/Debug/GNU-Linux/newmain.o:
您可以看到包含示例代码的 headers:
-include ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp
还为链接器提供了 .libs 和 src(可能不需要)文件夹
-L../../projects/xerces-c-3.2.2/src/ -L../../projects/xerces-c-3.2.2/src/xercesc/ -L../../projects/xerces-c-3.2.2/src/.libs
NetBeans 能够看到 #include <xercesc/util/PlatformUtils.hpp>
& 我什至可以点击 xerces PlatformUtils.hpp & 通过 IDE 查看函数实现。
1) 为什么 NetBeans 无法编译和找到 Xerces 库,即使 IDE 可以解析 headers?
2) 最后,我该如何解决这个问题? (我的包含正确吗?)
更新:
上述原始错误 "undefined references" 已根据用户 "jww" 的建议解决,请参阅评论。
1) 我 ch 将 #include 更改为 #include "xercesc/util/PlatformUtils.hpp" 2) 还通过项目属性、链接器、库菜单添加了 libxerces-c.a。
这些是 NetBeans 生成的更新的构建命令:
g++ -c -g -I../../projects/xerces-c-3.2.2/src/xercesc -I../../projects/xerces-c-3.2.2/src -I../../projects/xerces-c-3.2.2/src/.libs -include ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp -MMD -MP -MF "build/Debug/GNU-Linux/newmain.o.d" -o build/Debug/GNU-Linux/newmain.o newmain.cpp
mkdir -p dist/Debug/GNU-Linux
g++ -o dist/Debug/GNU-Linux/soff_test build/Debug/GNU-Linux/newmain.o -L../../projects/xerces-c-3.2.2/src/ -L../../projects/xerces-c-3.2.2/src/xercesc/ -L../../projects/xerces-c-3.2.2/src/.libs -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/.libs' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/xercesc' -lxerces-c
可以看到添加了-lxerces-c标志
现在我自然有新的错误,这些错误与示例代码无关,但在 xerces 库代码的深处,它们又是 "undefined references" 性质的。
See below:
/home/anaim/projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.cpp:70: undefined reference to `curl_global_init'
/home/anaim/projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.cpp:70: undefined reference to `curl_global_init'
../../projects/xerces-c-3.2.2/src/.libs/libxerces-c.a(CurlNetAccessor.o): In function `xercesc_3_2::CurlNetAccessor::cleanupCurl()':
/home/anaim/projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.cpp:78: undefined reference to `curl_global_cleanup'
../../projects/xerces-c-3.2.2/src/.libs/libxerces-c.a(CurlURLInputStream.o): In function `xercesc_3_2::CurlURLInputStream::readMore(int*)':
/home/anaim/projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp:269: undefined reference to `curl_multi_perform'
Etc, etc...
我还通过添加 -lcurl 和 -lpthread
解决了上述错误和更多错误这是最新的编译命令(同样是它的 NetBeans 生成的)
g++ -c -g -I../../projects/xerces-c-3.2.2/src/xercesc -I../../projects/xerces-c-3.2.2/src -include ../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/util/Transcoders/ICU/ICUTransService.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/xinclude/XIncludeDOMDocumentProcessor.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/xinclude/XIncludeLocation.hpp -include ../../projects/xerces-c-3.2.2/src/xercesc/xinclude/XIncludeUtils.hpp -MMD -MP -MF "build/Debug/GNU-Linux/newmain.o.d" -o build/Debug/GNU-Linux/newmain.o newmain.cpp
mkdir -p dist/Debug/GNU-Linux
g++ -o dist/Debug/GNU-Linux/soff_test build/Debug/GNU-Linux/newmain.o -L../../projects/xerces-c-3.2.2/src/ -L../../projects/xerces-c-3.2.2/src/xercesc/ -L../../projects/xerces-c-3.2.2/src/.libs -Wl,-rpath,'../../projects/xerces-c-3.2.2/src' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/xercesc' -Wl,-rpath,'../../projects/xerces-c-3.2.2/src/.libs' -lxerces-c -lcurl -lpthread
新错误:
再次 "undefined references":
../../projects/xerces-c-3.2.2/src/.libs/libxerces-c.a(ICUTransService.o): 在函数xercesc_3_2::ICUTransService::upperCase(unsigned short*)':
/home/anaim/projects/xerces-c-
3.2.2/src/xercesc/util/Transcoders/ICU/ICUTransService.cpp:358: undefined reference to
u_toupper_50'
等等...
1) 那么我是否必须重复相同的步骤并将 headers 添加到路径中直到这些问题得到解决?
这似乎是 NetBeans 的问题?
如果开发人员提供库的写入路径(在本例中为 xerces)并且 NetBeans 能够看到该库(它确实如此),为什么 NetBeans 不能生成正确的 compiler/linker 命令,这不是整点了一个C/C++IDE?
我最近的尝试:
我已经开始使用不依赖于 NetBeans 的自定义 Makefile。
这里是 Makefile:
# vars c++
CXX := g++
CXXFLAGS := -std=c++11 -Wall -g
#collect all c++ files $(wildcard *.cpp)
SOURCES_CC = newmain.cpp
#vars c
CC := gcc
CFLAGS := -std=c99 -Wall -g
#collect all c files
SOURCES_C := $(wildcard *.c)
#objects
OBJECTS_DIR := build
#construct objects from .c and .cpp to .o
OBJECTS := $(SOURCES_C:%.c=%.o) $(SOURCES_CC:%.cpp=%.o)
#final executable in dist
DIST_DIR := dist
PROGRAM := $(DIST_DIR)/main
#required libraries
LDFLAGS = -L../../projects/xerces-c-3.2.2/src/xercesc/ -lxerces-c
debug := CFLAGS
.PHONY: all
all debug: $(PROGRAM)
$(PROGRAM): $(OBJECTS)
$(CXX) -o $@ $(OBJECTS) $(LDFLAGS)
.PHONY: clean
clean:
rm -f $(PROGRAM) $(OBJECTS)
这是最新的错误:
cd '/home/myuser/NetBeansProjects/SOFF_test'
/usr/bin/gmake -f Makefile CONF=Debug
gmake: *** No rule to make target `-I../../projects/xerces-c-3.2.2/src/xercesc', needed by `dist/main'. Stop.
我能够使用此命令行构建 xerces:
g++ -std=c++11 -Wall -g -L../../projects/xerces-c-3.2.2/src/xercesc/ -o main newmain.cpp -lxerces-c
**这是我唯一的问题!如何更改此自定义 Makefile 以使用我自己的源文件(.c 和 .cpp)构建示例 xerces 示例
万分感谢!
在您的自定义 makefile 中,这一行
$(PROGRAM): $(INCLUDES) $(OBJECTS)
不正确。您告诉 make 您的程序依赖于目标文件 和告诉编译器包含文件所在位置的预处理器选项 。 -I../../projects/xerces-c-3.2.2/src/xercesc
不是您的可执行文件所依赖的文件。
从该行中删除 $(INCLUDES)
并将其用作预处理器选项:
CPPFLAGS := $(INCLUDES)
$(PROGRAM): $(OBJECTS)
$(CXX) -o $@ $(OBJECTS) $(LDFLAGS)
您的 LDFLAGS
中可能需要一个 -L../../projects/xerces-c-3.2.2/src/xercesc/
。
注意:您正在使用 SOURCES_CC
变量,但没有在任何地方定义它。
A well-meaning 版主 'Cody' 删除了这个(下方)答案而没有解释,即使它是正确答案的一部分。简而言之,伙计问的是 his/her 自定义 makefile,而不是 Netbeans 生成的东西。
我还注意到一个人关于从 object 的构建依赖项中删除“.d”文件的回复。通常(但不总是)这些是在编译后更新的,但它们也需要在初始编译发生之前构建。简单地从 objects 依赖项中删除它们可能意味着如果 headers 中有任何更改,受影响的 objects 可能不会重建,即使它们依赖于那些 headers。这是一种 chicken-egg 悖论,解决它的方法是构建一个特殊目标,如 'depend' .. 即 'make depend'。我没有在 Makefile 片段中看到这个目标,但也许我错过了?另一种不太常见的方法是制作一个像 'NODEPS' 这样的宏,它在 makefile 中添加一些条件到 avoid/skip 添加 '.d' 文件作为依赖项。因此,您会在初始构建时执行 'make NODEPS=1',然后在随后的 'make ' 构建中出现 'chicken'。
这是his/her最后一个问题:这是我唯一的问题!如何更改此自定义 Makefile 以构建示例:xerces 示例以及我自己的源文件(.c 和 .cpp)?
如果您从 /home/myuser/NetBeansProjects/SOFF_test 目录中执行 'ls ../../projects/xerces-c-3.2.2/src/xercesc' .. 它是否找到该目录,换句话说,从您所在的位置开始的相对路径是否有效 运行 编译器?如果不是,那么您需要对其进行更改 - 它可能就像在其中添加一个额外的 ../ 一样简单,例如 -
包括:= -I../../../projects/xerces-c-3.2.2/src/xercesc -I../../../projects/xerces-c-3.2.2/src -包括../../../projects/xerces-c-3.2.2/src/xercesc/util/PlatformUtils.hpp -包括../../../projects/xerces-c-3.2.2/src/xercesc/util/XMLUni.hpp -include ../../../projects/xerces-c-3.2.2/src/xercesc/util/XMLException.hpp -MMD -MP -MF "build/Debug/GNU-Linux/newmain.o.d"
根据您的评论,这是一个简单的 makefile .. 希望这对您有所帮助:)
CC = gcc
CXX = g++
CFLAGS = -std=c99 -Wall
CXXFLAGS = -std=c++11 -Wall
PROGRAM = dist/main
SOURCES_C = $(wildcard *.c)
SOURCES_CC = newmain.cpp
OBJS = $(SOURCES_C:%.c=%.o) $(SOURCES_CC:%.cpp=%.o)
LIBS = -L../../projects/xerces-c-3.2.2/src/xercesc/ -lxerces-c
all: $(PROGRAM)
clean:
rm -f $(PROGRAM) $(OBJS)
%.o : %.c
$(CC) -c $(CFLAGS) $<
%.o : %.cpp
$(CXX) -c $(CXXFLAGS) $<
$(PROGRAM): $(OBJS)
$(CXX) -o $@ $(OBJS) $(LIBS)
.PHONY: all clean