Difference between revisions of "FAQ-Compiling (errors)"

From Code::Blocks
Line 113: Line 113:
  
 
If the error includes a line number, it is likely that this is a problem with your code. Track down down your function declarations and implementations. Ensure they all match up, are spelled correctly, and have the correct scope resolution.
 
If the error includes a line number, it is likely that this is a problem with your code. Track down down your function declarations and implementations. Ensure they all match up, are spelled correctly, and have the correct scope resolution.
 +
 +
''VERY'' often you can get help by just googling for the name of the undefined reference, for his example "WSACleanup". Usually one of the first links is the SDK documentation, like [http://msdn.microsoft.com/en-us/library/windows/desktop/ms741549%28v=vs.85%29.aspx this from MSDN for WSACleanup]. You'll find there a lot useful information, including what libraries you need to link against, as for the exsample:
 +
'''Requirements'''
 +
* Minimum supported client: Windows 2000 Professional
 +
* Minimum supported server: Windows 2000 Server
 +
* Header: '''Winsock2.h'''
 +
* Library: '''Ws2_32'''.lib
 +
* DLL: '''Ws2_32.dll'''
 +
The header file '''Winsock2.h''' you need to include (most likely you have already in your app). The library you need to link against, you can remove the prefix and type "'''Ws2_32'''" in the linker options (make sure you have added the path to that library in the linker include path's options). You also know, that you should distribute '''Ws2_32.dll''' for the runtime version of you app, luckily this one usually ships with Windows anyways, so no need to do something here.
  
 
==== Q: My build fails in the compile/link/run step with a ''Permission denied'' error? ====
 
==== Q: My build fails in the compile/link/run step with a ''Permission denied'' error? ====

Revision as of 12:50, 29 June 2012

Return to FAQ.


Q: How do I troubleshoot a compiler problem?

A: I would start by turning on full Compiler logging.

This is done by selecting the "Full command line" option Under menu "Settings" -> "Compiler and Debugger" -> Global compiler settings -> [the compiler you use] -> "Other Setting" tab, "Compiler logging".

This option will make Code::Blocks output the exact commands it uses to compile your code.

Things to remember:

  • You should review all the commands and their options;
  • If you have compiled your app before, do a re-build (or clean before build) to see all compiling / linking steps;
  • If you don't know what an option or a command does please read the documentation for the compiler/linker you're using;
  • Look for missing commands;
  • For every source file (.cpp; .c; .d; etc) in your project, you must have at least one command in the log. This command must produce an object file (file extension .o if using gcc/g++ and .obj if using Visual Studio);
  • Every object file should be linked in the final executable, if not there are undefined symbols errors;
  • Remember the file extension matters: *.c is compiled as C file, *.cpp is compiled as C++ file. Read more

Q: My simple C++ program throws up lots of errors - what is going on?

If you have a C++ program like this:

 #include <iostream>
 int main() {
   std::cout << "hello world\n";
 }

and when you compile it you get errors like this:

 fatal error: iostream: No such file or directory

then you have probably given your source file a .c extension. If you do that, the GCC compiler (and others) will probably attempt to compile the file as a C program, not as C++. You should always give your C++ source files the extension .cpp to make sure the compiler handles them correctly.

Q: I imported a MSVCToolkit project/workspace, but Code::Blocks insists on trying to use GCC. What's wrong?

A: A little documentation problem ^^;. The "default compiler" is usually GCC, so when you imported it with "the default compiler", you told it to use GCC. To fix this situation, go to "Project", "Build Options" and select VC++ Toolkit as your compiler.

Another possibility is to put the Microsoft compiler as the default one. To do this, choose Settings - Compiler, choose the Microsoft compiler in the Selected Compiler section (top of dialog box) and press the Set as default button.

From now onwards, for all new projects the Microsoft compiler will be taken by default.

Q: When compiling a wxWidgets project, I get several "variable 'vtable for xxxx' can't be auto-imported". What's wrong?

A: You need to add WXUSINGDLL in "Project->Build options->Compiler #defines" and rebuild your project (or create a new project and use the "Using wxWidgets DLL" project option which adds "-DWXUSINGDLL" to Project->Build options->Other options). Other errors with the same resolution are: 'unresolved external symbol "char const * const wxEmptyString" (?wxEmptyString@@3PBDB)' or similar. If you were using 1.0-finalbeta and were trying to build a statically linked wxWidgets project, the cause of the problem was some faulty templates. But that's fixed now.

Q: I can't compile a multithreaded app with VC Toolkit! Where are the libraries?

A: Sorry, no fix for your problem...

Your problem doesn't come from CodeBlocks. It exists, because the free VC toolkit (VCTK) doesn't provide all the libraries and tools which come with Visual C++ (VC) which isn't free, unfortunately.

Try buying a full-fledged VC++, or even better, download MinGW

The libraries that can be obtained free of charge are:

Paths:

(VCT3) Visual C++ Toolkit 2003 - C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib
(PSDK) Platform SDK - C:\Program Files\Microsoft Platform SDK\Lib
(NSDK) .NET 1.1 SDK - C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib

C runtime libs:

LIBC.LIB 	Single-threaded, static link                                          (VCT3, NSDK)
LIBCMT.LIB 	Multithreaded, static link                                            (VCT3, NSDK)
MSVCRT.LIB 	Multithreaded, dynamic link (import library for MSVCR71.DLL)          (NSDK)
LIBCD.LIB 	Single-threaded, static link (debug)                                  (VCT3, NSDK)
LIBCMTD.LIB 	Multithreaded, static link (debug)                                    (NSDK)
MSVCRTD.LIB 	Multithreaded, dynamic link (import library for MSVCR71D.DLL) (debug) (NSDK)

C++ libs:

LIBCP.LIB 	Single-threaded, static link                                          (VCT3, PSDK)
LIBCPMT.LIB 	Multithreaded, static link                                            (VCT3)
MSVCPRT.LIB 	Multithreaded, dynamic link (import library for MSVCP71.dll)          (none)
LIBCPD.LIB 	Single-threaded, static link (debug)                                  (VCT3)
LIBCPMTD.LIB 	Multithreaded, static link (debug)                                    (none)
MSVCPRTD.LIB 	Multithreaded, dynamic link (import library for MSVCP71D.DLL) (debug) (none)

Try setting the library linker directories to:

C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib
C:\Program Files\Microsoft Platform SDK\Lib
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib

in that order.

The ones listed as (none) above are actually present in the IA64 and AMD64 subdirectories of the PSDK lib directory. Not sure if these would work on 32-bit windows, however, they may if they are meant to work in 32-bit compatibility mode on the 64-bit processors. Worth a try. Otherwise, you can link statically to the C++ library instead of using MSVCP71.dll. If you really want to link against MSVCP71.dll you can try to create MSVCP71.LIB from the dll using lib.exe and sed. Search google for "exports.sed" for detailed steps.

See also: tclsh script to extract import .lib from (any?) DLL (MinGW)

See also: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_c_run.2d.time_libraries.asp

See also: http://sapdb.2scale.net/moin.cgi/MS_20C_2b_2b_20Toolkit

Q: I get this error when compiling: Symbol "isascii" was not found in "codeblocks.dll"

A: Make sure you didn't mix up the MSVC headers or libs with the MinGW ones.

Q: My build fails with multiple undefined reference errors?

Example:

undefined reference to `WSACleanup@8
undefined reference to `WSACleanup@0

A: Most of the time it is because the required library is not linked with your project. Go to Project->Build options...->Linker settings (tab) and add the required library or libraries.

If the error includes a line number, it is likely that this is a problem with your code. Track down down your function declarations and implementations. Ensure they all match up, are spelled correctly, and have the correct scope resolution.

VERY often you can get help by just googling for the name of the undefined reference, for his example "WSACleanup". Usually one of the first links is the SDK documentation, like this from MSDN for WSACleanup. You'll find there a lot useful information, including what libraries you need to link against, as for the exsample: Requirements

  • Minimum supported client: Windows 2000 Professional
  • Minimum supported server: Windows 2000 Server
  • Header: Winsock2.h
  • Library: Ws2_32.lib
  • DLL: Ws2_32.dll

The header file Winsock2.h you need to include (most likely you have already in your app). The library you need to link against, you can remove the prefix and type "Ws2_32" in the linker options (make sure you have added the path to that library in the linker include path's options). You also know, that you should distribute Ws2_32.dll for the runtime version of you app, luckily this one usually ships with Windows anyways, so no need to do something here.

Q: My build fails in the compile/link/run step with a Permission denied error?

A: There are several possible causes for this:

  1. The output directory does not have read/write access.
    • Either change control settings on the output directory, or move the project to different location.
  2. A previous instance of the executable failed to terminate properly.
    • Open your system's equivalent of Process/Task Manager, search the list for the name of the executable Code::Blocks is trying to output, and terminate it.
    • Logging off or rebooting will achieve the same effect.
  3. The executable is open.
    • If the executable is open in a hex-editor or actively being run, close it.
  4. Security software is interfering.
    • The target file is locked while an antivirus programming is scanning it; either wait a few seconds for the antivirus scan to finish, set an exception in the antivirus settings, or (temporarily) disable the antivirus program.
    • Firewalls with very strict settings sometimes block execution; try reducing the firewall's settings or adding an exception.
    • Switching security software may have left traces behind that are interfering; hunt down the remnants of the old antivirus/firewall software and remove them.
  5. The file/library cannot be found.
  6. Code::Blocks was improperly installed.
    • Mixing binaries from a stable release and a nightly build (or even two different nightly builds) is highly likely to cause a slew of problems; reinstall Code::Blocks in an empty directory.
  7. Multiple installed compilers are interfering with each other.
    • If they are not required to keep, completely remove all but the most used compiler.
    • If several compilers are required, ensure that none of them are in the system path (this is so that Code::Blocks will be able to manage all paths).
    • Also, do not place any compilers in their default installation path (for example C:\MinGW), as some compilers are hard-coded to look for headers in a default path before searching their own respective directories.

See also: [/index.php/topic,15047.0.html Permission denied forums discussion]

Q: My build fails to link due to multiple definition of xyz errors?

A: GCC 4.6.1 mingw target (Windows) is known to occasionally (and erroneously) report this if link-time optimization (-flto) is used.

First, of course, check that no token has been defined multiple times. If the source code is clean, and yet the errors persist, adding linker switch (Project->Build options...->Linker settings (tab))

-Wl,--allow-multiple-definition

will enable the code to link.

See also: Bug 12762


Return to FAQ.