billyquith / ponder

C++ reflection library with Lua binding, and JSON and XML serialisation.
http://billyquith.github.io/ponder/
Other
640 stars 93 forks source link

linking pondertest.exe on Windows using msys/mingw fails #38

Closed dehesselle closed 8 years ago

dehesselle commented 8 years ago

I'm using mingw-w64 on msys2 and cmake -G "Unix Makefiles". Then make fails to link pondertest.exe:

...
[100%] Linking CXX executable pondertest.exe
CMakeFiles/pondertest.dir/arrayproperty.cpp.o:arrayproperty.cpp:(.text$_ZN10ponder_ext11ValueMapperIN6ponder9ValueTypeEvE2toB5cxx11ES2_[_ZN10ponder_ext11ValueMapperIN6ponder9ValueTypeEvE2toB5cxx11ES2_]+0x27): undefined reference to `ponder::detail::typeAsString(ponder::ValueType)'
CMakeFiles/pondertest.dir/traits.cpp.o:traits.cpp:(.text+0x9e7e): undefined reference to `ponder::detail::typeAsString(ponder::ValueType)'
CMakeFiles/pondertest.dir/traits.cpp.o:traits.cpp:(.text+0x9f92): undefined reference to `ponder::detail::typeAsString(ponder::ValueType)'
CMakeFiles/pondertest.dir/traits.cpp.o:traits.cpp:(.text+0xa0a6): undefined reference to `ponder::detail::typeAsString(ponder::ValueType)'
collect2.exe: error: ld returned 1 exit status
make[2]: *** [test/CMakeFiles/pondertest.dir/build.make:720: test/pondertest.exe] Fehler 1
make[1]: *** [CMakeFiles/Makefile2:123: test/CMakeFiles/pondertest.dir/all] Fehler 2
make: *** [Makefile:161: all] Fehler 2

The contents of ${MY_BUILD_DIR}/test/CMakeFiles/pondertest.dir/link.txt is:

/mingw64/bin/c++.exe     CMakeFiles/pondertest.dir/arrayproperty.cpp.o CMakeFiles/pondertest.dir/class.cpp.o CMakeFiles/pondertest.dir/classvisitor.cpp.o CMakeFiles/pondertest.dir/constructor.cpp.o CMakeFiles/pondertest.dir/dictionary.cpp.o CMakeFiles/pondertest.dir/enum.cpp.o CMakeFiles/pondertest.dir/enumclass.cpp.o CMakeFiles/pondertest.dir/enumclassobject.cpp.o CMakeFiles/pondertest.dir/enumclassproperty.cpp.o CMakeFiles/pondertest.dir/enumobject.cpp.o CMakeFiles/pondertest.dir/enumproperty.cpp.o CMakeFiles/pondertest.dir/example_mainpage.cpp.o CMakeFiles/pondertest.dir/function.cpp.o CMakeFiles/pondertest.dir/functionaccess.cpp.o CMakeFiles/pondertest.dir/inheritance.cpp.o CMakeFiles/pondertest.dir/main.cpp.o CMakeFiles/pondertest.dir/mapper.cpp.o CMakeFiles/pondertest.dir/property.cpp.o CMakeFiles/pondertest.dir/propertyaccess.cpp.o CMakeFiles/pondertest.dir/string_view.cpp.o CMakeFiles/pondertest.dir/tagholder.cpp.o CMakeFiles/pondertest.dir/traits.cpp.o CMakeFiles/pondertest.dir/userobject.cpp.o CMakeFiles/pondertest.dir/userproperty.cpp.o CMakeFiles/pondertest.dir/value.cpp.o  -o pondertest.exe -Wl,--out-implib,libpondertest.dll.a -Wl,--major-image-version,0,--minor-image-version,0  ../libponder.dll.a

I can fix the build by replacing ../libponder.dll.awith ../msys-ponder.dll and adding ../CMakeFiles/ponder.dir/src/util.cpp.o just before -o pondertest.exe:

/mingw64/bin/c++.exe     CMakeFiles/pondertest.dir/arrayproperty.cpp.o CMakeFiles/pondertest.dir/class.cpp.o CMakeFiles/pondertest.dir/classvisitor.cpp.o CMakeFiles/pondertest.dir/constructor.cpp.o CMakeFiles/pondertest.dir/dictionary.cpp.o CMakeFiles/pondertest.dir/enum.cpp.o CMakeFiles/pondertest.dir/enumclass.cpp.o CMakeFiles/pondertest.dir/enumclassobject.cpp.o CMakeFiles/pondertest.dir/enumclassproperty.cpp.o CMakeFiles/pondertest.dir/enumobject.cpp.o CMakeFiles/pondertest.dir/enumproperty.cpp.o CMakeFiles/pondertest.dir/example_mainpage.cpp.o CMakeFiles/pondertest.dir/function.cpp.o CMakeFiles/pondertest.dir/functionaccess.cpp.o CMakeFiles/pondertest.dir/inheritance.cpp.o CMakeFiles/pondertest.dir/main.cpp.o CMakeFiles/pondertest.dir/mapper.cpp.o CMakeFiles/pondertest.dir/property.cpp.o CMakeFiles/pondertest.dir/propertyaccess.cpp.o CMakeFiles/pondertest.dir/string_view.cpp.o CMakeFiles/pondertest.dir/tagholder.cpp.o CMakeFiles/pondertest.dir/traits.cpp.o CMakeFiles/pondertest.dir/userobject.cpp.o CMakeFiles/pondertest.dir/userproperty.cpp.o CMakeFiles/pondertest.dir/value.cpp.o ../CMakeFiles/ponder.dir/src/util.cpp.o  -o pondertest.exe -Wl,--out-implib,libpondertest.dll.a -Wl,--major-image-version,0,--minor-image-version,0  ../msys-ponder.dll

But I'm out of my depth here, I don't understand why I had to link in ../CMakeFiles/ponder.dir/src/util.cpp.o- isn't this object supposed to be supplied by the DLL (I checked ${MY_BUILD_DIR}/CMakeFiles/ponder.dir/link.txt and it's there)?

billyquith commented 8 years ago

I think it is because you are making a DLL and the symbols aren't exported. I think this is only an issue on Windows.

billyquith commented 8 years ago

This should be fixed now. I'll have to add a CI test for DLL linking. Thanks for the report.

dehesselle commented 8 years ago

Thanks - it works now as expected!