Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Project should use CMake #128

Open
DarthMike opened this issue May 11, 2013 · 29 comments
Open

Project should use CMake #128

DarthMike opened this issue May 11, 2013 · 29 comments

Comments

@DarthMike
Copy link
Owner

Using CMake will enable us to just edit one project config, thus easing the development when new features or even single files need to be added to compile targets.

@M-F-K
Copy link
Collaborator

M-F-K commented May 11, 2013

Note to self: remember to take a look at issue #19 when creating the Cmake setup for linux.

@Smilex
Copy link

Smilex commented Sep 21, 2013

My CMake implementation is well on the way. The library libIndieLib builds for me, but with no DirectX support and Tests haven't been added yet.
However I'm posting here because I'm having an issue. When I try to test libIndieLib, built with CMake, I get undefined references.

/tmp/cc6m8U90.o: In function main': main.cpp:(.text+0x11): undefined reference toIndieLib::init(int)'
main.cpp:(.text+0x73): undefined reference to IND_Render::initRenderAndWindow(IND_WindowProperties&)' main.cpp:(.text+0x7c): undefined reference toIndieLib::end()'
/tmp/cc6m8U90.o: In function IND_Render::IND_Render()': main.cpp:(.text._ZN10IND_RenderC2Ev[_ZN10IND_RenderC5Ev]+0x23): undefined reference toIND_Timer::IND_Timer()'
collect2: error: ld returned 1 exit status

Yet, I can see that indielib.cpp and IND_Render.cpp are being built. Checking libIndieLib with nm also shows that these symbols are missing.
Is this some issue you guys recognise?

@DarthMike
Copy link
Owner Author

@Smilex Great! CMake is a transition we definitely want to make.

Hm, I can just guess why is it you have these undefined refs. What platform are you compiling for?

@Smilex
Copy link

Smilex commented Sep 21, 2013

Ubuntu Raring, Linux 64 bit arch

@Smilex
Copy link

Smilex commented Sep 21, 2013

You should be able to recreate it by checking out my cmake branch.

This is my test code. Compiled with: g++ --std=c++11 -L"." -lIndieLib main.cpp

#include "../common/include/Indie.h"

int main()
{
    IndieLib::init(IND_DEBUG_MODE);

    IND_Render * render = new IND_Render;


    IND_WindowProperties properties("Test",800,600, 32, false, false, true);
    IND_Window * window = render->initRenderAndWindow( properties );

    IndieLib::end();

    return 0;
}

@M-F-K
Copy link
Collaborator

M-F-K commented Sep 21, 2013

Hi,

Hmm, in thoose clases we use preprocessor macros. But you state thet the
classes are buildt, so that shouldn't be a problem.

On 21/09/2013 20:21 "Ian T. Jacobsen" [email protected] wrote:

My CMake implementation is well on the way. The library libIndieLib
builds for me, but with no DirectX support and Tests haven't been
added yet.
However I'm posting here because I'm having an issue. When I try to
test libIndieLib, built with CMake, I get undefined references.

/tmp/cc6m8U90.o: In function main':
main.cpp:(.text+0x11): undefined reference toIndieLib::init(int)'
main.cpp:(.text+0x73): undefined reference to
IND_Render::initRenderAndWindow(IND_WindowProperties&)'
main.cpp:(.text+0x7c): undefined reference toIndieLib::end()'
/tmp/cc6m8U90.o: In function IND_Render::IND_Render()':
main.cpp:(.text._ZN10IND_RenderC2Ev[_ZN10IND_RenderC5Ev]+0x23):
undefined reference toIND_Timer::IND_Timer()'
collect2: error: ld returned 1 exit status

Yet, I can see that indielib.cpp and IND_Render.cpp are being built.
Checking libIndieLib with nm also shows that these symbols are
missing.
Is this some issue you guys recognise?


Reply to this email directly or view it on GitHub
<#128 (comment)
omment-24867926>.

@M-F-K
Copy link
Collaborator

M-F-K commented Sep 21, 2013

Hi Ian,

I did the buildsetting for the linux version (very poorly i might add) .
I think it will help you if you take a look at the:

linux/tutorials/basic/01_Installing (makefile)

The code is placed at:

IndieLib/tutorials/basic/01_Installing/

The code in Cindielib.cpp and Cindielib.h is the code im referring to.

Hope it can help.

Regards.

Michael,

On 21/09/2013 22:51 "Ian T. Jacobsen" [email protected] wrote:

You should be able to recreate it by checking out my cmake branch.

This is my test code. Compiled with: g++ --std=c++11 -L"." -lIndieLib
main.cpp

#include "../common/include/Indie.h"

int main()
{
IndieLib::init(IND_DEBUG_MODE);

IND_Render * render = new IND_Render;

IND_WindowProperties properties("Test",800,600, 32, false, false,
true);
IND_Window * window = render->initRenderAndWindow( properties );

IndieLib::end();

return 0;
}


Reply to this email directly or view it on GitHub
<#128 (comment)
omment-24870388>.

@DarthMike
Copy link
Owner Author

I'm checking on my side. Trying to understand and figure out what happens. By the way, very good work on setting CMake up! I want a pull request when it works :)

@Smilex
Copy link

Smilex commented Sep 21, 2013

Ok, I'm using Tutorial 01 now for testing. Seems like there are undefined references to everything. Not sure what's going on

@DarthMike
Copy link
Owner Author

I can't get the files to configure. I get GLEW not found errors on OSX and Debian virtual machine.

Are you building static lib? It would be helpful if you can upload the output of nm to a file.

@Smilex
Copy link

Smilex commented Sep 21, 2013

DarthMike: I'm building a shared lib. On Debian do "sudo apt-get install libglew-dev". The local source for GLEW doesn't work yet with CMake

http://www.cmake.org/pipermail/cmake/2004-April/004948.html
The above link indicates that my linker errors might be because of the linker order. I'm wondering which libraries depend on each other in IndieLib?

@Smilex
Copy link

Smilex commented Sep 21, 2013

Output of nm http://sprunge.us/beJR

@DarthMike
Copy link
Owner Author

Try building static lib. I think in the code, Defines.h for Linux, we miss a line like this:
#define LIB_EXP attribute ((visibility("default")))

Actually the same as OSX and iOS.

By building a static Indielib library this is not a problem.

I see in nm output, all Indielib symbols are defined. Buy you may be right, and there is static lib order issue. Thing is depencencies are quite independent to each other. So only GLEW and SDL may be related, as FreeImage is independent, so is TiXml

@Smilex
Copy link

Smilex commented Sep 22, 2013

I get the same issues by building statically

@Smilex
Copy link

Smilex commented Sep 22, 2013

Turns out that many of the dependencies for IndieLib aren't linked statically into the IndieLib library. I have now successfully built the first tutorial, with IndieLib built with CMake as a static library. I'll look into statically linking dependencies.
Are there any dependencies that shouldn't be linked statically?

@DarthMike
Copy link
Owner Author

We currently link all dependencies statically. For iOS all libs need to be statically linked, so I changed it in other platforms as well.

@Smilex
Copy link

Smilex commented Sep 22, 2013

SDL 2 has CMake build files in its git repository, and because of that I see no reason for me to do my own. Other than that, I'm building everything in statically.

@DarthMike
Copy link
Owner Author

So was the issue related to linking dependencies as shared libs? Was it anything else?

@Smilex
Copy link

Smilex commented Sep 24, 2013

When building the tutorial, or just any application using IndieLib, you have to link most of the dependencies for IndieLib (SDL, GLEW, etc.) to your application as well.

@DarthMike
Copy link
Owner Author

@Smilex Hm that should not be the case. It depends how the dependencies are linked against indielib. They should be linked statically, regardless if we build an Indielib shared or static library.

The point of libs like indielib is to hide those dependencies. On current setups, client apps don't need to link against:
SDL
GLEW
FreeImage

Unless they want to use those in their code, not by using Indielib.

@Smilex
Copy link

Smilex commented Oct 2, 2013

I'm working on fixing it, but I'm quite busy at the moment.

@Smilex
Copy link

Smilex commented Oct 19, 2013

It's been awhile, but I think I'm almost there. The cmake branch is now rebased on a new SDL-hg branch, which is SDL taken from their hg repo. This is because CMake files for SDL are in there.
Everything seems to compile static libraries now, however I'm having some issues with GLEW.

libFreeImage.a(GetType.cpp.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC

I did push my progress so far, to my fork because I don't expect to have much time to work on this.

@Smilex
Copy link

Smilex commented Oct 19, 2013

Ok IndieLib compiles. Just a few linker errors left

@DarthMike
Copy link
Owner Author

@Smilex great :)

@M-F-K
Copy link
Collaborator

M-F-K commented Oct 19, 2013

@Smilex any chance, that you can post those linker errors here, just so we have an idea what's left when we pickup the code?

@Smilex
Copy link

Smilex commented Oct 19, 2013

For FreeImage I was having build issues with libjpeg (missing io.h) and libtiff (missing unixio.h). First I tried figuring it out, but found that libopenjpeg also exists, so I decided to drop building libjpeg. libtiff had a very similiar issue, so I decided to drop it (with the plan of solving it later). So now when I try to build a tutorial with IndieLib, I get undefined references to libtiff, amongst other things, which doesn't come as a surprise, but that's where I'm at now.
All of the issues seem isolated to FreeImage from a glance. Look at common/dependencies/FreeImage/CMakeLists.txt

indielib-crossplatform/IndieLib/tutorials/basic/01_Installing$ g++ -I../../../common/include -L../../../build CIndieLib.cpp Tutorial01.cpp -lIndieLib
../../../build/libIndieLib.so: undefined reference to `typeinfo for Iex::BaseExc'
../../../build/libIndieLib.so: undefined reference to `TIFFReadRGBAImage'
../../../build/libIndieLib.so: undefined reference to `LibRaw::dcraw_process()'
../../../build/libIndieLib.so: undefined reference to `LibRaw::unpack()'
../../../build/libIndieLib.so: undefined reference to `half::_eLut'
../../../build/libIndieLib.so: undefined reference to `jpeg_resync_to_restart'
../../../build/libIndieLib.so: undefined reference to `Imf::IStream::readMemoryMapped(int)'
../../../build/libIndieLib.so: undefined reference to `LibRaw_abstract_datastream::tempbuffer_close()'
../../../build/libIndieLib.so: undefined reference to `Imf::Header::~Header()'
../../../build/libIndieLib.so: undefined reference to `Imf::InputFile::readPixels(int, int)'
../../../build/libIndieLib.so: undefined reference to `Imf::OutputFile::setFrameBuffer(Imf::FrameBuffer const&)'
../../../build/libIndieLib.so: undefined reference to `Imf::OutputFile::OutputFile(Imf::OStream&, Imf::Header const&, int)'
../../../build/libIndieLib.so: undefined reference to `Imf::IStream::~IStream()'
../../../build/libIndieLib.so: undefined reference to `TIFFSetMode'
../../../build/libIndieLib.so: undefined reference to `jpeg_std_error'
../../../build/libIndieLib.so: undefined reference to `Imf::RgbaOutputFile::RgbaOutputFile(Imf::OStream&, Imf::Header const&, Imf::RgbaChannels, int)'
../../../build/libIndieLib.so: undefined reference to `jpeg_CreateDecompress'
../../../build/libIndieLib.so: undefined reference to `jpeg_start_compress'
../../../build/libIndieLib.so: undefined reference to `TIFFSetField'
../../../build/libIndieLib.so: undefined reference to `Imf::RgbaInputFile::readPixels(int, int)'
../../../build/libIndieLib.so: undefined reference to `jpeg_set_quality'
../../../build/libIndieLib.so: undefined reference to `Imf::RgbaInputFile::setFrameBuffer(Imf::Rgba*, unsigned long, unsigned long)'
../../../build/libIndieLib.so: undefined reference to `jpeg_read_header'
../../../build/libIndieLib.so: undefined reference to `TIFFClose'
../../../build/libIndieLib.so: undefined reference to `TIFFGetField'
../../../build/libIndieLib.so: undefined reference to `TIFFSetTagExtender'
../../../build/libIndieLib.so: undefined reference to `TIFFDefaultStripSize'
../../../build/libIndieLib.so: undefined reference to `TIFFTileSize'
../../../build/libIndieLib.so: undefined reference to `TIFFComputeStrip'
../../../build/libIndieLib.so: undefined reference to `typeinfo for Imf::IStream'
../../../build/libIndieLib.so: undefined reference to `TIFFCurrentDirectory'
../../../build/libIndieLib.so: undefined reference to `jpeg_destroy_decompress'
../../../build/libIndieLib.so: undefined reference to `Imf::OStream::~OStream()'
../../../build/libIndieLib.so: undefined reference to `half::_toFloat'
../../../build/libIndieLib.so: undefined reference to `Imf::InputFile::~InputFile()'
../../../build/libIndieLib.so: undefined reference to `Imf::InputFile::setFrameBuffer(Imf::FrameBuffer const&)'
../../../build/libIndieLib.so: undefined reference to `Imf::OutputFile::~OutputFile()'
../../../build/libIndieLib.so: undefined reference to `jpeg_save_markers'
../../../build/libIndieLib.so: undefined reference to `Iex::BaseExc::~BaseExc()'
../../../build/libIndieLib.so: undefined reference to `Imf::OutputFile::writePixels(int)'
../../../build/libIndieLib.so: undefined reference to `jpeg_destroy'
../../../build/libIndieLib.so: undefined reference to `TIFFWriteScanline'
../../../build/libIndieLib.so: undefined reference to `LibRaw::recycle()'
../../../build/libIndieLib.so: undefined reference to `jpeg_finish_compress'
../../../build/libIndieLib.so: undefined reference to `TIFFDataWidth'
../../../build/libIndieLib.so: undefined reference to `TIFFReadDirectory'
../../../build/libIndieLib.so: undefined reference to `typeinfo for Imf::OStream'
../../../build/libIndieLib.so: undefined reference to `Imf::globalThreadCount()'
../../../build/libIndieLib.so: undefined reference to `TIFFTileRowSize'
../../../build/libIndieLib.so: undefined reference to `TIFFReadEncodedStrip'
../../../build/libIndieLib.so: undefined reference to `Imf::FrameBuffer::insert(char const*, Imf::Slice const&)'
../../../build/libIndieLib.so: undefined reference to `LibRaw::LibRaw(unsigned int)'
../../../build/libIndieLib.so: undefined reference to `LibRaw::unpack_thumb()'
../../../build/libIndieLib.so: undefined reference to `LibRaw::dcraw_clear_mem(libraw_processed_image_t*)'
../../../build/libIndieLib.so: undefined reference to `Imf::RgbaOutputFile::writePixels(int)'
../../../build/libIndieLib.so: undefined reference to `TIFFSetDirectory'
../../../build/libIndieLib.so: undefined reference to `TIFFFieldWithTag'
../../../build/libIndieLib.so: undefined reference to `TIFFGetFieldDefaulted'
../../../build/libIndieLib.so: undefined reference to `jpeg_destroy_compress'
../../../build/libIndieLib.so: undefined reference to `TIFFIsTiled'
../../../build/libIndieLib.so: undefined reference to `jpeg_write_marker'
../../../build/libIndieLib.so: undefined reference to `Imf::OStream::OStream(char const*)'
../../../build/libIndieLib.so: undefined reference to `Imf::Header::Header(Imath::Box<Imath::Vec2<int> > const&, Imath::Box<Imath::Vec2<int> > const&, float, Imath::Vec2<float> const&, float, Imf::LineOrder, Imf::Compression)'
../../../build/libIndieLib.so: undefined reference to `jpeg_finish_decompress'
../../../build/libIndieLib.so: undefined reference to `jpeg_set_defaults'
../../../build/libIndieLib.so: undefined reference to `Imf::RgbaOutputFile::setFrameBuffer(Imf::Rgba const*, unsigned long, unsigned long)'
../../../build/libIndieLib.so: undefined reference to `TIFFIsByteSwapped'
../../../build/libIndieLib.so: undefined reference to `Imf::Header::previewImage() const'
../../../build/libIndieLib.so: undefined reference to `_TIFFDataSize'
../../../build/libIndieLib.so: undefined reference to `Imf::Header::hasPreviewImage() const'
../../../build/libIndieLib.so: undefined reference to `Imf::Slice::Slice(Imf::PixelType, char*, unsigned long, unsigned long, int, int, double, bool, bool)'
../../../build/libIndieLib.so: undefined reference to `TIFFClientOpen'
../../../build/libIndieLib.so: undefined reference to `jpeg_start_decompress'
../../../build/libIndieLib.so: undefined reference to `Imf::Header::setPreviewImage(Imf::PreviewImage const&)'
../../../build/libIndieLib.so: undefined reference to `Imf::InputFile::header() const'
../../../build/libIndieLib.so: undefined reference to `TIFFMergeFieldInfo'
../../../build/libIndieLib.so: undefined reference to `Imf::PreviewImage::~PreviewImage()'
../../../build/libIndieLib.so: undefined reference to `Imf::IStream::isMemoryMapped() const'
../../../build/libIndieLib.so: undefined reference to `Imf::RgbaInputFile::~RgbaInputFile()'
../../../build/libIndieLib.so: undefined reference to `TIFFGetTagListEntry'
../../../build/libIndieLib.so: undefined reference to `LibRaw::open_datastream(LibRaw_abstract_datastream*)'
../../../build/libIndieLib.so: undefined reference to `Imf::ChannelList::begin() const'
../../../build/libIndieLib.so: undefined reference to `jpeg_write_scanlines'
../../../build/libIndieLib.so: undefined reference to `jpeg_write_m_header'
../../../build/libIndieLib.so: undefined reference to `TIFFReadEXIFDirectory'
../../../build/libIndieLib.so: undefined reference to `TIFFSetSubDirectory'
../../../build/libIndieLib.so: undefined reference to `Imf::Header::channels()'
../../../build/libIndieLib.so: undefined reference to `Imf::ChannelList::end() const'
../../../build/libIndieLib.so: undefined reference to `Imf::RgbaOutputFile::~RgbaOutputFile()'
../../../build/libIndieLib.so: undefined reference to `Imf::Header::dataWindow() const'
../../../build/libIndieLib.so: undefined reference to `Iex::throwErrnoExc(std::string const&)'
../../../build/libIndieLib.so: undefined reference to `TIFFScanlineSize'
../../../build/libIndieLib.so: undefined reference to `jpeg_CreateCompress'
../../../build/libIndieLib.so: undefined reference to `Imf::IStream::IStream(char const*)'
../../../build/libIndieLib.so: undefined reference to `TIFFReadTile'
../../../build/libIndieLib.so: undefined reference to `TIFFLastDirectory'
../../../build/libIndieLib.so: undefined reference to `jpeg_read_scanlines'
../../../build/libIndieLib.so: undefined reference to `Imf::RgbaInputFile::RgbaInputFile(Imf::IStream&, int)'
../../../build/libIndieLib.so: undefined reference to `jpeg_write_m_byte'
../../../build/libIndieLib.so: undefined reference to `Imf::ChannelList::insert(char const*, Imf::Channel const&)'
../../../build/libIndieLib.so: undefined reference to `half::convert(int)'
../../../build/libIndieLib.so: undefined reference to `Imf::InputFile::InputFile(Imf::IStream&, int)'
../../../build/libIndieLib.so: undefined reference to `LibRaw_abstract_datastream::make_byte_buffer(unsigned int)'
../../../build/libIndieLib.so: undefined reference to `typeinfo for LibRaw_abstract_datastream'
../../../build/libIndieLib.so: undefined reference to `jpeg_simple_progression'
../../../build/libIndieLib.so: undefined reference to `TIFFWriteDirectory'
../../../build/libIndieLib.so: undefined reference to `TIFFSwabArrayOfLong'
../../../build/libIndieLib.so: undefined reference to `vtable for LibRaw_abstract_datastream'
../../../build/libIndieLib.so: undefined reference to `Imf::Header::channels() const'
../../../build/libIndieLib.so: undefined reference to `Iex::BaseExc::what() const'
../../../build/libIndieLib.so: undefined reference to `LibRaw_abstract_datastream::tempbuffer_open(void*, unsigned long)'
../../../build/libIndieLib.so: undefined reference to `Imf::ChannelList::findChannel(char const*) const'
../../../build/libIndieLib.so: undefined reference to `LibRaw::dcraw_make_mem_thumb(int*)'
../../../build/libIndieLib.so: undefined reference to `TIFFGetTagListCount'
../../../build/libIndieLib.so: undefined reference to `LibRaw::dcraw_make_mem_image(int*)'
../../../build/libIndieLib.so: undefined reference to `Imf::PreviewImage::PreviewImage(unsigned int, unsigned int, Imf::PreviewRgba const*)'
../../../build/libIndieLib.so: undefined reference to `Iex::BaseExc::BaseExc(std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)'
../../../build/libIndieLib.so: undefined reference to `TIFFStripSize'
../../../build/libIndieLib.so: undefined reference to `Imf::Channel::Channel(Imf::PixelType, int, int, bool)'
collect2: error: ld returned 1 exit status

@DarthMike
Copy link
Owner Author

Moved issue to 0.7

@M-F-K
Copy link
Collaborator

M-F-K commented Apr 3, 2019

got the cmake build up and running. have sucessfully build the static version of indielib , and build the tutorials and benchmark tests using the static build. The executables runs fine, and is about 8 mb big. All work is done in the CMAKE branch.

@M-F-K
Copy link
Collaborator

M-F-K commented Apr 14, 2019

All non3D Tutorials Tests and Unittest are now up and running in CMAKE. Haven't had succes with building the tileless editor yet though. It is really cool to see Everything being buildt and linked by a single command =)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants
@Smilex @DarthMike @M-F-K and others