[CMake] problem linking a library and addressing cross dependency

Zahid Iqbal zahid.iqbal at gmail.com
Mon Jul 17 12:42:06 EDT 2017


Hi,

I have started using *cmake* recently.  I have the following question:

For building my system, I am working with two directories. Let's call them
*my_application_directory* and *protocol_source_directory. *

The code relating to my application resides under *my_application_directory*.
In fact, my application needs to interact with *protocol_source_directory*.
My application needs some functions from  *protocol_source_directory *as
well as it can provide some functionality to some process that is within
the *protocol_source_directory. *

*protocol_source_directory *is an existing protocol suite with its own
 top-level *makefile *that compiles and builds the protocol and generates a
static library.  The directory structure for *protocol_source_directory *is
as follows:

*protocol_source_directory*
*|*
*|*___ *dir1*
*        |*
*        |__ config*
*        |__ include*
*        |__ libs*
*        |__ misc*
*        |__ src*
*                |*
*                |__ modules*
                *|**           |*
                *|**           |__ layerA*
                *|**           |__ layerB*
                *|**           |__ layerC*
                *|**           |__ layerD*
*                |*
*                |*
*                |__ debug_tests*
                          *|*
               *           |__ **my_application_directory*

Imagine a scenario in which there was no *my_application_directory. *In
this case, *protocol_source_directory *builds and compiles with the
*makefile* under *protocol_source_directory/**dir1.  *The static library
generated (e.g. protocol_lib.a) is available under
*protocol_source_directory/dir1/libs/. *

Purpose of developing an application is to add some functionality in the
protocol and then develop an application to test that functionality.

To fulfill this purpose, new files are added,


   - Few of new files are added at the location
*protocol_source_directory/dir1/src/modules/layerC/.
   *There is a *local makefile* at this level which is updated to reflect
   these new files.
   - some of the files need some definitions from *my_application_directory.
   *Therefore, I update the *local makefile* to include the needed paths to
   *my_application_directory. *so that I can use necessary headers inside
   ".c" files without path qualifiers.


*Having done this, *

*protocol_source_directory *builds and compiles with the *makefile* under
*protocol_source_directory/**dir1 *and generates the static library e.g.
protocol_lib.a.


   - Remaining functionality is implemented in files that reside under
*my_application_directory.
   *It is important to note that *my_application_directory *can be at
   location *protocol_source_directory/dir1/src/debug_tests/my_application_directory/
   *or it can exists separately at the same level as the
   *protocol_source_directory*


Imagine a scenario where, my *my_application_directory *is separate (not
inside) the *protocol_source_directory.  *Here is the* CMakeLists.txt *that
I am using to build my* application *while interacting with* protocol
source. *


project(PS_TEST)

cmake_minimum_required(VERSION 2.8)


# manually adding the sources using the set command as follows:

set(SRC_LIST main.c ISH.c ish_db.c ish_generator.c messages.c
my_string_help.c populate_ish.c

ISH.h ish_db.h ish_generator.h messages.h my_string_help.h
populate_ish.h my_types.h)

add_executable(${PROJECT_NAME} ${SRC_LIST})


# adding c99 style options

set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 99)



set(FTT_BASE *protocol_source_directory*/*dir1*)


set(CORE_INCLUDES ${FTT_BASE}/src/modules/layerC/include/)

set(ETH_INCLUDES ${FTT_BASE}/src/modules/layerA/include/)

set(CORE_COMMONS ${FTT_BASE}/src/modules/layerC/common/)

set(MASTER_INCLUDES ${FTT_BASE}/src/modules/layerC/master/)



include_directories(include ${FTT_BASE}/config/
${FTT_BASE}/misc/make-rules/ ${FTT_BASE}/misc/arch-ports/
${CORE_INCLUDES} ${ETH_INCLUDES} ${CORE_COMMONS} ${MASTER_INCLUDES})

add_definitions(${FTT_COMPILE_OPT}$)



# linking to the protocl library code

find_library (FTT_LIB protocol_lib.a *protocol_source_directory*/*dir1**/libs/*)

target_link_libraries(${PROJECT_NAME} ${FTT_LIB})


Having done all this,

when I build my application using cmake, it gives me the following error:

my_types.h no such file and directory


please note that* my_types.h*  is in *my_application_directory.  *But,
since, some definitions are needed, I have included this file (i.e.,
include "my_types.h") in some .c files which are at
*protocol_source_directory/dir1/src/modules/layerC/.*

*Question:  *What I am doing wrong here, I have included the needed paths*
to **my_application_directory, *in the* local makefile *at
*protocol_source_directory/dir1/src/modules/layerC/.
**protocol_source_directory
*is compiling ok*, *why I receive this error after I link with static
project libray.




thanks for your help and time.


Regards,

zahid
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20170717/cca6085b/attachment.html>


More information about the CMake mailing list