diff --git a/README.md b/README.md
index c6fdd9f..079a0f7 100644
--- a/README.md
+++ b/README.md
@@ -592,3 +592,12 @@ Maintainer Mode

 通过在命令行上加 --enable-silent-rules来减少noisy，也可以通过在configure.ac中添加AM_SILENT_RULES宏，或为AM_INIT_AUTOMAKE添加参数slient-rules
+
+
+
+
+LD_PRELOAD经常用于调试。
+
+Libtool提供一个脚本(ltmain.sh)，这样config.status认为Libtool已经开启了。config.status脚本将configure 的test结果和ltmain.sh脚本转换为一个为当前项目裁剪的libtool script；然后，项目的makefiles会使用这个脚本，为每一个LTLIBRARIES primary生成动态库。ltmain.sh脚本应该作为发行包的一部分。automake生成的规则会解决这个问题。Libtol也可以用于生成静态库，只需在命令行使用--disable-shared即可。
+
+Libtool提供运行时抽象，动态库实现名称为ltdl，相当于UNIX系统中的libdl.so(提供了dlopen等接口)，今可能的使用这个库，因为它不仅仅提供了一个多平台通用的共享库API，它还提供了一个抽象手动动态链接共享库和非共享库平台。
diff --git a/Makefile.am b/Makefile.am
index 6c7749b..0cc076e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1 +1 @@
-SUBDIRS = common src
+SUBDIRS = common include libjup src
diff --git a/README.md b/README.md
index 079a0f7..22936b4 100644
--- a/README.md
+++ b/README.md
@@ -601,3 +601,24 @@ LD_PRELOAD经常用于调试。
 Libtool提供一个脚本(ltmain.sh)，这样config.status认为Libtool已经开启了。config.status脚本将configure 的test结果和ltmain.sh脚本转换为一个为当前项目裁剪的libtool script；然后，项目的makefiles会使用这个脚本，为每一个LTLIBRARIES primary生成动态库。ltmain.sh脚本应该作为发行包的一部分。automake生成的规则会解决这个问题。Libtol也可以用于生成静态库，只需在命令行使用--disable-shared即可。

 Libtool提供运行时抽象，动态库实现名称为ltdl，相当于UNIX系统中的libdl.so(提供了dlopen等接口)，今可能的使用这个库，因为它不仅仅提供了一个多平台通用的共享库API，它还提供了一个抽象手动动态链接共享库和非共享库平台。
+
+
+include创建原则，如果我提供的是一组共同使用的头文件，并且用户也是一起使用，那么就放在项目最顶层的include下，否则
+在每个src下创建一个include
+
+
+LT_INIT 参数，重要的有：
+1、dlopen 如果要使用ltdl库就要加这个参数；
+2、disable-fast-install
+3、shared and disable-shared
+4、static and disable-static
+5、pic-only and no-pic
+
+
+留意书中158页关于DRY的看法。
+
+将public头文件放在最前面是个好习惯，让人一目了然，这个头文件的使用，不依赖于任何其他的头文件。
+
+
+
+用于内部使用的库也叫convenience libraries(方便库)，如果使用了noinst，那么这个库就被认为是convenience_libraries，会被编译成静态库。
diff --git a/common/Makefile.am b/common/Makefile.am
index d879710..2828d07 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -1,3 +1,2 @@
-noinst_LIBRARIES = libjupcommon.a
-libjupcommon_a_SOURCES = jupcommon.h print.c
-
+noinst_LTLIBRARIES = libjupcommon.la
+libjupcommon_la_SOURCES = jupcommon.h print.c
diff --git a/configure.ac b/configure.ac
index d951fd5..ea0006b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,6 +4,9 @@
 AC_PREREQ([2.69])
 AC_INIT([Jupiter], [3.0], [Tyrion.Lannister.274AL@gmail.com])
 AM_INIT_AUTOMAKE
+LT_PREREQ([2.4.2])
+LT_INIT([dlopen])
+
 AC_CONFIG_SRCDIR([src/main.c])
 AC_CONFIG_HEADERS([config.h])

@@ -13,13 +16,13 @@ _DEBUG_START_
 AC_CHECK_PROG([bash_var], [bash], [yes], [no], , [/usr/sbin/bash])
 _DEBUG_END_
 AC_PROG_INSTALL
-AC_PROG_RANLIB
+# AC_PROG_RANLIB
 AM_PROG_CC_C_O

 # Checks for command-line options
-#AC_ARG_ENABLE([async-exec],
-#    [  --enable-async-exec    enable async exec],
-#    [async_exec=${enableval}], [async_exec=no])
+# AC_ARG_ENABLE([async-exec],
+#     [  --enable-async-exec    enable async exec],
+#     [async_exec=${enableval}], [async_exec=no])

 AC_ARG_ENABLE([async-exec],
     [AS_HELP_STRING([--disable-async-exec],
@@ -84,6 +87,8 @@ fi

 AC_CONFIG_FILES([Makefile
                  common/Makefile
+                 include/Makefile
+                 libjup/Makefile
                  src/Makefile])
 AC_OUTPUT

diff --git a/src/Makefile.am b/src/Makefile.am
index 0f14601..227ebd7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,7 @@
 bin_PROGRAMS = jupiter
 jupiter_SOURCES = main.c
-jupiter_CPPFLAGS = -I$(top_srcdir)/common
-jupiter_LDADD = ../common/libjupcommon.a
+jupiter_CPPFLAGS = -I$(top_srcdir)/include
+jupiter_LDADD = ../libjup/libjupiter.la

 check_SCRIPTS = greptest.sh
 TESTS = $(check_SCRIPTS)
diff --git a/src/main.c b/src/main.c
index b759f67..bc225eb 100644
--- a/src/main.c
+++ b/src/main.c
@@ -8,22 +8,9 @@
 #include <pthread.h>
 #endif

-#if 0
-#if HAVE_STDINT_H
-#include <stdint.h>
-#elif HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-uint16_t x;
-#endif
-
-static void* print_it(void* data) {
-    fprintf(stdout, "Hello from %s!\n", (const char *)data);
-    return NULL;
-}
+#include <libjupiter.h>

-int main(int argc, char *argv[])
-{
-    return print_routine(argv[0]);
+int main(int argc, char *argv[]) {
+    jupiter_print(argv[0]);
+    return 0;
 }