Linux, ICC, Makefile, подлинковать mysqlclient.so в свою .so
От: Schnitzer Германия  
Дата: 23.12.08 08:00
Оценка:
Добрый день. Компилятор ICC, ось – CentOS.
Подскажите, пожалуйста, как правильно подлинковать либу mysqlclient.so в свою so-либку?
Ну и подключить каталоги include и lib мускуля.

Makefile:
SHELL = /bin/sh
CC = /opt/intel/cc/10.1.015/bin/icc
CFLAGS = -fpic -DFINAL_BUILD -DMISSIONPACK -DQAGAME -D_JK2 -D__linux__ -O2 -Os -mp1
LDFLAGS = -static -shared -static-libcxa -Bstatic -limf
BINARY = jampgamei386.so
INSTALLDIR = /usr/local/games/ja2/ojpbasic

OFILES = NPC_AI_Civilian.o g_autosave.o NPC_AI_SaberDroid.o bg_weaponsdat.o NPC_AI_RocketTrooper.o \
    ai_aotc.o ai_hybrid.o g_dynmusic.o g_roff.o AnimalNPC.o FighterNPC.o NPC.o NPC_AI_Atst.o \
    NPC_AI_Default.o NPC_AI_Droid.o NPC_AI_GalakMech.o NPC_AI_Grenadier.o NPC_AI_Howler.o \
    NPC_AI_ImperialProbe.o NPC_AI_Interrogator.o NPC_AI_Jedi.o NPC_AI_Mark1.o NPC_AI_Mark2.o \
    NPC_AI_MineMonster.o NPC_AI_Rancor.o NPC_AI_Remote.o NPC_AI_Seeker.o NPC_AI_Sentry.o \
    NPC_AI_Sniper.o NPC_AI_Stormtrooper.o NPC_AI_Utils.o NPC_AI_Wampa.o NPC_behavior.o \
    NPC_combat.o NPC_goal.o NPC_misc.o NPC_move.o NPC_reactions.o NPC_senses.o NPC_sounds.o \
    NPC_spawn.o NPC_stats.o NPC_utils.o SpeederNPC.o WalkerNPC.o ai_main.o ai_util.o ai_wpnav.o \
    bg_g2_utils.o bg_misc.o bg_panimate.o bg_pmove.o bg_saber.o bg_saberLoad.o bg_saga.o bg_slidemove.o \
    bg_vehicleLoad.o bg_weapons.o g_ICARUScb.o g_active.o g_arenas.o g_bot.o g_client.o g_cmds.o \
    g_combat.o g_exphysics.o g_items.o g_log.o g_main.o g_mem.o g_misc.o g_missile.o g_mover.o g_nav.o \
    g_navnew.o g_object.o g_saga.o g_session.o g_spawn.o g_strap.o g_svcmds.o g_syscalls.o g_target.o \
    g_team.o g_timer.o g_trigger.o g_turret.o g_turret_G2.o g_utils.o g_vehicleTurret.o g_vehicles.o \
    g_weapon.o q_math.o q_shared.o tri_coll_test.o w_force.o w_saber.o aotctc_holocron.o g_breakable.o \
    ai_tab.o g_camera.o NPC_AI_AssassinDroid.o NPC_AI_Sand_creature.o g_crash.o

$(BINARY): $(OFILES)
    $(CC) $(LDFLAGS) -o $(BINARY) $(OFILES)

.c.o:
    $(CC) $(CFLAGS) -w0 -c $*.c -o $*.o

clean:
    rm -f $(OFILES)
    rm -f $(BINARY)

install:
    cp -f $(BINARY) $(INSTALLDIR)

uninstall:
    rm -f $(INSTALLDIR)/$(BINARY)
Re: Linux, ICC, Makefile, подлинковать mysqlclient.so в свою
От: neFormal Россия  
Дата: 23.12.08 10:30
Оценка:
Здравствуйте, Schnitzer, Вы писали:

S>Ну и подключить каталоги include и lib мускуля.


добавь флажки, например в CFLAGS.. что то типа:
-I/usr/include/mysql -L/usr/lib/ -lmysqlclient


первые два — пути до файлов, третий — указание линковки с такой то библиотекой..
указывать расширения — плохо, т.к. получается жесткая привязка к определенному типу..

S>Подскажите, пожалуйста, как правильно подлинковать либу mysqlclient.so в свою so-либку?


а это я не знаю.. задавался таким вопросом, но в доках не нашел еще..
...coding for chaos...
Re[2]: Linux, ICC, Makefile, подлинковать mysqlclient.so в с
От: Schnitzer Германия  
Дата: 23.12.08 11:20
Оценка:
Здравствуйте, neFormal, Вы писали:

F>добавь флажки, например в CFLAGS.. что то типа:

F>-I/usr/include/mysql -L/usr/lib/ -lmysqlclient

F>а это я не знаю.. задавался таким вопросом, но в доках не нашел еще..


Все примерно так и делаю но не работает.
При загрузке самой jampgamei386.so выдает такую ошибку:

Sys_LoadDll(/usr/local/games/ja2/ojpbasic/jampgamei386.so)
failed: "/usr/local/games/ja2/ojpbasic/jampgamei386.so: undefined symbol: mysql_init"
Re[3]: Linux, ICC, Makefile, подлинковать mysqlclient.so в с
От: neFormal Россия  
Дата: 23.12.08 11:48
Оценка:
Здравствуйте, Schnitzer, Вы писали:

F>>а это я не знаю.. задавался таким вопросом, но в доках не нашел еще..

ключевая фраза была..

S>Все примерно так и делаю но не работает.

S>При загрузке самой jampgamei386.so выдает такую ошибку:
S>
S>Sys_LoadDll(/usr/local/games/ja2/ojpbasic/jampgamei386.so)
S>failed: "/usr/local/games/ja2/ojpbasic/jampgamei386.so: undefined symbol: mysql_init"
S>


да, флажки работают только для сборки бинарников.. с .so-шками всё иначе..
могу предложить вот такую статью, где описана работа с .so-файлами: http://www.ibm.com/developerworks/library/l-shobj/

если хочешь всё таки их скрестить, то имхо есть 2 варианта:
1. поискать флажки в man gcc
2. использовать libelf для непосредственной записи нужных данных в твою .so-шку.. но это изврат

имхо лучше просто прилинковать к бинарнику еще и -lmysqlclient..

ЗЫЖ кстати, зря игнорируешь указание soname при создании .so-шки..
...coding for chaos...
Re[3]: Linux, ICC, Makefile, подлинковать mysqlclient.so в с
От: neFormal Россия  
Дата: 23.12.08 12:10
Оценка: 3 (1) +1
Здравствуйте, Schnitzer, Вы писали:

F>>а это я не знаю.. задавался таким вопросом, но в доках не нашел еще..


вычитал кой чего
для сборки .so-шки с gcc (!) нужно писать:
gcc -shared -Wl, -soname, soname -o libname filelist liblist


где,
filelist — список .o файлов, к которым надо получить доступ
liblist — список библиотек, к которым будет получать доступ эта библиотека.. (не стороннее приложение, а только библиотека)

например,
gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.1.0.1 foo.o bar.o -lc


но это для гцц.. для интеловского компилятора может быть иначе..
...coding for chaos...
Re[4]: Linux, ICC, Makefile, подлинковать mysqlclient.so в с
От: Schnitzer Германия  
Дата: 23.12.08 16:41
Оценка:
Здравствуйте, neFormal, Вы писали:

F>gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.1.0.1 foo.o bar.o -lc

F>но это для гцц.. для интеловского компилятора может быть иначе..

собрал таким способом при помощи гцц, работает
правда... боюсь багов теперь будет масса...
спасибо!
Re[4]: Linux, ICC, Makefile, подлинковать mysqlclient.so в с
От: Schnitzer Германия  
Дата: 23.12.08 20:23
Оценка: 5 (1)
Здравствуйте, neFormal, Вы писали:

F>gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.1.0.1 foo.o bar.o -lc

F>но это для гцц.. для интеловского компилятора может быть иначе..

В общем Спасибо большое. Разобрался как это реализовать на ICC.
Может кому поможет... Выкладываю работоспособный Makefile:

SHELL = /bin/sh
CC = /opt/intel/cc/10.1.015/bin/icc
OPT = -fPIC -O2 -Os -mp1 -mtune=core2 -march=core2 -axT
LDFLAGS = -shared -static-intel -Xlinker
CFLAGS = -DFINAL_BUILD -DMISSIONPACK -DQAGAME -D_JK2 -D__linux__ -I/usr/include/mysql/
MYSQL = /usr/lib/mysql/libmysqlclient_r.so.15.0.0
BINARY = jampgamei386.so
INSTALLDIR = /usr/local/games/ja2/ojpbasic

OFILES = NPC_AI_Civilian.o g_autosave.o NPC_AI_SaberDroid.o bg_weaponsdat.o NPC_AI_RocketTrooper.o \
    ai_aotc.o ai_hybrid.o g_dynmusic.o g_roff.o AnimalNPC.o FighterNPC.o NPC.o NPC_AI_Atst.o \
    NPC_AI_Default.o NPC_AI_Droid.o NPC_AI_GalakMech.o NPC_AI_Grenadier.o NPC_AI_Howler.o \
    NPC_AI_ImperialProbe.o NPC_AI_Interrogator.o NPC_AI_Jedi.o NPC_AI_Mark1.o NPC_AI_Mark2.o \
    NPC_AI_MineMonster.o NPC_AI_Rancor.o NPC_AI_Remote.o NPC_AI_Seeker.o NPC_AI_Sentry.o \
    NPC_AI_Sniper.o NPC_AI_Stormtrooper.o NPC_AI_Utils.o NPC_AI_Wampa.o NPC_behavior.o \
    NPC_combat.o NPC_goal.o NPC_misc.o NPC_move.o NPC_reactions.o NPC_senses.o NPC_sounds.o \
    NPC_spawn.o NPC_stats.o NPC_utils.o SpeederNPC.o WalkerNPC.o ai_main.o ai_util.o ai_wpnav.o \
    bg_g2_utils.o bg_misc.o bg_panimate.o bg_pmove.o bg_saber.o bg_saberLoad.o bg_saga.o bg_slidemove.o \
    bg_vehicleLoad.o bg_weapons.o g_ICARUScb.o g_active.o g_arenas.o g_bot.o g_client.o g_cmds.o \
    g_combat.o g_exphysics.o g_items.o g_log.o g_main.o g_mem.o g_misc.o g_missile.o g_mover.o g_nav.o \
    g_navnew.o g_object.o g_saga.o g_session.o g_spawn.o g_strap.o g_svcmds.o g_syscalls.o g_target.o \
    g_team.o g_timer.o g_trigger.o g_turret.o g_turret_G2.o g_utils.o g_vehicleTurret.o g_vehicles.o \
    g_weapon.o q_math.o q_shared.o tri_coll_test.o w_force.o w_saber.o aotctc_holocron.o g_breakable.o \
    ai_tab.o g_camera.o NPC_AI_AssassinDroid.o NPC_AI_Sand_creature.o g_crash.o

$(BINARY): $(OFILES)
    $(CC) $(OPT) $(LDFLAGS) -o $(BINARY) $(OFILES) $(MYSQL) -lc

.c.o:
    $(CC) $(CFLAGS) -w0 -c $*.c -o $*.o

clean:
    rm -f $(OFILES)
    rm -f $(BINARY)

install:
    cp -f $(BINARY) $(INSTALLDIR)

uninstall:
    rm -f $(INSTALLDIR)/$(BINARY)


Обратите внимание на $(LDFLAGS) и способ прилинковки $(MYSQL).
Re[5]: Linux, ICC, Makefile, подлинковать mysqlclient.so в с
От: Schnitzer Германия  
Дата: 23.12.08 20:28
Оценка:
Здравствуйте, Schnitzer, Вы писали:

S>правда... боюсь багов теперь будет масса...

S>спасибо!

Опасения оправдались GCC — в данном случае не катит.
Масса багов и производительность падает.
Re[5]: Linux, ICC, Makefile, подлинковать mysqlclient.so в с
От: neFormal Россия  
Дата: 24.12.08 08:44
Оценка:
Здравствуйте, Schnitzer, Вы писали:

S>Разобрался как это реализовать на ICC.


кроме флажка -Xlinker то же самое?.

S>Может кому поможет... Выкладываю работоспособный Makefile:

S>
S>MYSQL = /usr/lib/mysql/libmysqlclient_r.so.15.0.0
S>


имхо, зря сделана эта заточка под so.15
...coding for chaos...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.