Linker errors linking to .a files on OS X


 
Thread Tools Search this Thread
Top Forums Programming Linker errors linking to .a files on OS X
# 1  
Old 12-13-2014
Linker errors linking to .a files on OS X

Basically my problem is that when I try to compile anything using ./configure && make, it fails because of linker errors. I can reproduce the behavior I'm getting as follows:

I have the two following files

main.c:
Code:
#include <stdio.h>

extern void func(void);

int
main(int argc, char **argv)
{
    printf("Before func\n");
    func();
    return 0;
}

func.c:
Code:
#include <stdio.h>

void
func(void)
{
    printf("In func\n");
}

If I do the commands
Code:
gcc -c func.c
gcc -c main.c
ar rc func.a func.o
gcc -o test main.o func.a

I get the output
Code:
ld: warning: ignoring file func.a, file was built for archive which is not the architecture being linked (x86_64): func.a
Undefined symbols for architecture x86_64:
  "_func", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

Any idea what I should do?

Last edited by MarshallBanana; 12-13-2014 at 12:43 AM..
# 2  
Old 12-13-2014
When I run those commands with the source files you provided on OS X Yosemite 10.10.1, I don't get any diagnostic messages from ld, and when I run ./test afterwards, I get:
Code:
Before func
In func

as I would expect from that code. Please look at the contents of your archive with:
Code:
ar -tv func.a

It should show something like:
Code:
rw-r--r--     501/20           24 Dec 12 21:41 2014 __.SYMDEF SORTED
rw-r--r--     501/20          816 Dec 12 21:41 2014 func.o

If the __.SYMDEF SORTED entry isn't present, try:
Code:
ar -s func.a

which should create (or recreate) the symbol table for the archive.
This User Gave Thanks to Don Cragun For This Post:
# 3  
Old 12-13-2014
My output for ar -tv func.a is:
Code:
rw-r--r-- 502/20    684 Dec 12 20:29 2014 func.o

So I did ar -s func.a, but my output for ar -tv func.a is the same. I might mention that ar worked perfectly fine until I installed MacPorts. I deleted MacPorts but that didn't solve the problem.

Last edited by MarshallBanana; 12-13-2014 at 03:20 AM..
# 4  
Old 12-13-2014
Did you follow the MacPorts directions for uninstalling MacPorts, or did you just "rm" it?

I don't have any experience with MacPorts, but glancing through the on-line documentation it seems that MacPorts may change the target architecture to the port you were working on. That would explain the ld diagnostic:
Code:
ld: warning: ignoring file func.a, file was built for archive which is not the architecture being linked (x86_64): func.a
Undefined symbols for architecture x86_64:
  "_func", referenced from:
      _main in main.o

but I'm afraid I don't know how to help you correct the problem.

One possibility is that MacPorts might have installed alternative versions of gcc or ar in a directory in your PATH before the standard locations for those utilities. Does type ar gcc ld indicate any directory other than /usr/bin for any of those utilities? If it is something else, try:
Code:
/usr/bin/gcc -c func.c main.c
/usr/bin/ar -src func.a func.o
/usr/bin/gcc -o test main.o func.a

This User Gave Thanks to Don Cragun For This Post:
# 5  
Old 12-13-2014
Also, check the output from the command:
file main.o func.o
It should be something like:
Code:
func.o: Mach-O 64-bit object x86_64
main.o: Mach-O 64-bit object x86_64

If you're seeing something other than x86_64 that is the problem. (But, I'm not sure how to tell gcc to produce x86_64 architecture code instead of whatever you're getting.)
# 6  
Old 12-13-2014
Good suggestion on checking my PATH. A weird ar got installed in /usr/local/bin. The one in /usr/bin works as expected. The problem turned out to simpler than I thought. Thanks for your help.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Script for linking files with paths in 2 text files

I have 2 txt files, 1.txt and 2.txt which contain the paths to files that need to be linked. Example 1.txt: /root/001/folder2/image4.nii.gz /root/002/folder2/image4.nii.gz Example 2.txt: /root/001/folder2/image5.nii.gz /root/002/folder2/image5.nii.gz Each line represents images from... (7 Replies)
Discussion started by: LeftoverStew
7 Replies

2. Solaris

runtime linker errors

Hey guys I have a solaris 10 OS, with a zone configured. In that zone, I am trying to install an Oracle Client. However, when I run the oracle installer, I get the following error: ld.so.1: java: fatal: libexpat.so.0: open failed: No such file or directory ld.so.1: java: fatal:... (2 Replies)
Discussion started by: goodvikings
2 Replies

3. Solaris

proc precompilation - linking results in symbolic referncing errors

I can compile and link a piece of code on Solaris 2.6 .. I want the same thing to be done on Solaris8.. I am getting symbolic refernce errors while linking... Errors looks to be with proc symbols defination.. Any ideas ?? fgs_lib/finder_dbl.pkg_shr_def->lib/finder_dbl.so expand_file "cc -G... (0 Replies)
Discussion started by: shafi2all
0 Replies

4. Shell Programming and Scripting

Recursively hard linking files -- bonehead question

I used to program ksh a while back, but I've been off in Oracle/Windows land (for clients -- not by choice) for so long that I can't remember what should be an easy thing. Here's the scenario: 1)Find all files and directories beneath some directory point (A). 2)If directory, make the... (7 Replies)
Discussion started by: scyphers
7 Replies

5. Shell Programming and Scripting

checking ERRors in files

I m having trouble in a script.I need To write a script that will check for Following Errors in Logs Files,i.e files having Extension .log The erros are 2008-01-01 15:19:11,822 ERROR - ORA-01115: IO error reading block from file 51 (block # 717090) ORA-01110: data file 51:... (4 Replies)
Discussion started by: ali560045
4 Replies

6. Programming

C files searching and Linking

Dear friends, First off all , let me apologize for my inexperience. I am just starting use of Linux and gcc . Actually I ve some .c files in the present directory , and now I am giving +vc <my_file1.c> <my.file2.c> <myfile3.c>. All the c files are in present directory.... (2 Replies)
Discussion started by: user_prady
2 Replies

7. UNIX for Dummies Questions & Answers

Linking Files in UNIX (shortcuts)

Hello, Can anyone tell me how I can make a file link or shortcut in UNIX 4.0, several file links where damaged during an outage examples below. Examples: file -> file libX11.so -> /usr/shlib/libX11.so.pre.O3D All of the file links that were damaged were in /shlib and point to... (3 Replies)
Discussion started by: jays337
3 Replies

8. UNIX for Dummies Questions & Answers

modifying C file and linking back to project files

hi, This is the first time I work in a big C project. All source code files are located in say directory /source/pp and all header files are in /include/pp. I've created a link to both of these directories from my home dir, say /home/ss. So in the /home/ss dir I have the /source/pp and /include/pp... (1 Reply)
Discussion started by: bruins2005
1 Replies

9. Programming

Linking problem while linking to shared library

Hi I'm getting ld: fatal: option -h and building a dynamic executable are incompatible ld: fatal: Flags processing errors When I run ld -shared -L/usr/dt/lib -lDtSvc -o builtin.so Workspace.o after running gcc -fPIC -I/usr/X11R6/include -I/usr/dt/include -c Workspace.c I'm... (6 Replies)
Discussion started by: laho
6 Replies

10. Programming

compiling and linking 2 C files ...??

Hi mates, I am trying to copile and link to C programs with command: cc file1,file2 but i raises the error "file not found" ... am i doing the right way? any suggestion will be appreciated. thanks abdul (4 Replies)
Discussion started by: abdul
4 Replies
Login or Register to Ask a Question