Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

uint32_t does not name a type

Tags:

c++

linux

gcc

I have shared code given to me that compiles on one linux system but not a newer system. The error is uint32_t does not name a type. I realize that this is often fixed by including the <cstdint> or stdint.h. The source code has neither of these includes and I am trying to seek an option that doesn't require modifying due to internal business practices that I can't control. Since it compiles as is on one machine they don't want changes to the source code.

I am not sure if it matters but the older system uses gcc 4.1 while the newer one uses gcc 4.4. I could install different versions of gcc if needed, or add/install library/include files on the newer machine, I have full control of what is on that machine.

What are my options for trying to compile this code on my machine without modifying the source? I can provide other details if needed.

like image 469
Michael Avatar asked Nov 17 '16 19:11

Michael


People also ask

What does uint32_t mean in C?

uint32_t is a numeric type that guarantees 32 bits. The value is unsigned, meaning that the range of values goes from 0 to 232 - 1.

What is the difference between uint32 and uint32_t?

uint32_t is standard, uint32 is not. That is, if you include <inttypes. h> or <stdint. h> , you will get a definition of uint32_t .

Where uint32_t is defined?

This type is defined in the C header <stdint.

Where is null declared?

NULL is defined in the following header files: CRTDBG. H, LOCALE. H, STDDEF. H, STDIO.


2 Answers

I am not sure if it matters but the older system uses gcc 4.1 while the newer one uses gcc 4.4

GCC stopped including <stdint.h> some time ago. You now have to include something to get it...

I realize that this is often fixed by including the <cstdint> or stdint.h. The source code has neither of these includes and I am trying to seek an option that doesn't require modifying due to internal business practices that I can't control...

I hope I am not splitting hairs... If you can't modify the source files, then are you allowed to modify the build system or configuration files; or the environment? If so, you can use a force include to insert the file. See Include header files using command line option?

You can modify Makefile to force include stdint.h. If the build system honors CFLAGS or CXXFLAGS, then you can force include it in the flags. You last choice is probably to do something like export CC="gcc -include stdint.h".

The reason I am splitting hairs is OpenSSL and FIPS. The OpenSSL source files for the FIPS Object Module are sequestered and cannot be modified. We have to fallback to modifying supporting scripts and the environment to get some things working as expected.

like image 194
jww Avatar answered Nov 09 '22 06:11

jww


If you really don't want to amend the file you could wrap it. Suppose it's called src.c create a new file src1.c:

#include <stdint.h>
#include "src.c"

And then compile src1.c.

PS: The problem may arise because compilers include other headers in their header files. This can mean some symbols 'officially' defined in other headers are quietly defined when you include a header that isn't specified as including it.

It's an error to write a program relying on a symbol for which the appropriate header hasn't been included - but it's easy to do and difficult to spot.

A changing compiler or version sometimes reveals these quiet issues.

like image 2
Persixty Avatar answered Nov 09 '22 05:11

Persixty